首页 > 其他分享 >差分约束

差分约束

时间:2023-04-30 15:45:02浏览次数:30  
标签:dist int tt 源点 差分 约束 quad st

差分约束系统用于求解一组特殊的 N 元一次不等式组. 它包含了 N 个变量 x1 ~ xnM 个约束条件, 其中每个约束条件形如: \(x_i \leqslant x_j + c_k\) (最短路) , \(x_i \geqslant x_j +c_k\) (最长路)

约束条件 \(x_i \leqslant x_j +c_k\) , 可转化为一条有向边 \(j \stackrel{c_k}{\rightarrow} i\) , 最短路中有 dist[i] <= dist[j] + ck


差分约束

(1) 求不等式组的可行解

\(\quad\) 源点需要满足的条件: 从源点出发, 一定可以走到所有的边

\(\quad\) 步骤:

\(\quad\) [1] 先找到每个不等式 \(x_i \leqslant x_j + c_k\) 转化成一条从 j 走到 i , 长度为 ck 的边

\(\quad\) [2] 找到一个源点, 使得该源点一定可以遍历到所有边

\(\quad\) [3] 从源点求一遍单源最短路

\(\quad\) \(\quad\) 结果1: 如果存在负环, 则原不等式组一定无解

\(\quad\) \(\quad\) 结果2: 如果没有负环, 则 dist[i] 就是原不等式组的一个可行解

(2) 如果求最大值或者最小值, 这里的最值指的是每个变量的最值

\(\quad\) 结论: 如果求的是最小值, 则应该求最长路; 如果求的是最大值, 则应该求最短路

\(\quad\) 问题: 如何转化 \(x_i \leqslant c\) , 其中 c 是一个常数, 这类的不等式

\(\quad\) 方法: 建立一个超级源点, 0 , 建立 \(0 \stackrel{c}{\rightarrow} i\) 的边

\(\quad\) 求 xi 的最大值, 即求对 xi 的所有约束条件中的最小值/ 最小上界 (最短路)

最小值 : 最长路 \(\Longrightarrow\) 大于号 \(\Longrightarrow\) \(x_i \geqslant x_j + c_k\)

最大值 : 最短路 \(\Longrightarrow\) 小于号 \(\Longrightarrow\) \(x_i \leqslant x_j + c_k\)


当存在负环/ 正环时, spfa 用栈处理比用堆处理更快

//spfa判断是否有正环(栈实现)
//单源最长路,求最小值

bool spfa ()
{
    int hh=0,tt=1;
    memset(dist,-0x3f,sizeof dist);
    dist[0]=0;
    q[0]=0;
    st[0]=true;
    
    while(hh!=tt)
    {
        int t=q[--tt];
        st[t]=false;
        
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dist[j]<dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n+1)return true;	//包含源点0
                if(!st[j])
                {
                    q[tt++]=j;
                    st[j]=true;
                }
            }
        }
    }
    return false;
}
//spfa判断是否有负环(堆实现)
//单源最短路,求最大值

bool spfa ()
{
    int hh=0,tt=1;
    memset(dist,0x3f,sizeof dist);
    dist[0]=0;
    q[0]=0;
    st[0]=true;
    
    while(hh!=tt)
    {
        int t=q[hh++];
        if(hh==N)hh=0;
        st[t]=true;
        
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n+1)return true;	//包含源点0
                if(!st[j])
                {
                    q[tt++]=j;
                    if(tt==N)tt=0;
                    st[j]=true;
                }
            }
        }
    }
    return false;
}

标签:dist,int,tt,源点,差分,约束,quad,st
From: https://www.cnblogs.com/evilboy/p/17365354.html

相关文章

  • 芯片SDC约束 -复制保存
    https://www.cnblogs.com/pcc-uvm/p/16996456.html?share_token=9651df97-e94c-4653-bf71-0a0fd6ca415e&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_android&utm_campaign=client_share芯片SDC约束1.芯片开发流程 数字开发过程中主要可以分为数......
  • Oracle数据库设计——定义约束 主键
    Oracle数据库设计——定义约束主键[code]声明约束主键(PRIMARYKEY)一张表不一定有主键,但大多数表都创建了主键,主键值必须唯一并且组成主键的各列都不能为空。想象一下存储学生信息的一张表。在学生表(STUDENTS)每个学生有且仅有一行记录。因此,在S......
  • nsga2-带约束条件的多目标优化
    logiccodeclcclearcloseall%%定义自变量范围nvar=5;nobj=2;npop=20;maxit=50;pc=0.8;nc=round(pc*npop/2)*2;mu=0.05;%自变量约束条件varmin=[1030.66];varmax=[132.8211.641];%自变量变化步长step=[10.10.50.051];len=(varmax-varmin).*step;......
  • Unity3D:目标约束
    推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生目标约束(AimConstraints)AimConstraint可旋转游戏对象以朝向其源游戏对象。还可针对另一个轴保持一致方向。例如,可将AimConstraint添加到摄像机。要在约束瞄准摄像机时保持摄像机直立,请指定摄像机的向上轴和......
  • 【IT老齐012】外键约束
    【IT老齐012】外键约束优点保证数据的完整性和一致性级联操作方便数据一致性交给数据库,代码量小缺点性能问题额外的数据一致性校验查询并发问题外键约束会启用行级锁主表写入时会进入阻塞级联删除问题多层级联删除会让数据变得不可控数据耦合问题数据库......
  • Employees、临时表的创建 & 外键约束
    一.Employees1.Employees数据库介绍Employees数据库是一个用于学习和测试的数据库,大约160MB,4百万条记录2.Employees的安装2.1安装[root@MyServertest_db]>mysql-uroot-p<employees.sql2.2验证[root@vm-1employees_db]#timemysql-uroot-p-t<test_employ......
  • mysql字段过长无法作为约束、索引的解决方案
    背景:对接过程中遇到一个场景 需要用(网页链接+请求id)作为唯一约束,由于url很长,我在一开始就设置为了text字段。ALTERTABLExxx.xxxADDCONSTRAINTxxxUNIQUEKEY(xxxx);在加约束时报错:SQL错误[1170][42000]:BLOB/TEXTcolumn'xxxx'usedinkeyspecificationwith......
  • m基于混合高斯模型和帧间差分相融合的自适应视频背景提取算法matlab仿真
    1.算法仿真效果matlab2013b仿真结果如下:混合高斯模型背景提取:利用混合高斯模型处理这段视频,黑车已经运动离开画面左下角时,左下角仍然有黑车,这种现象我们称为“鬼影”。其产生的原因是由于混合高斯模型是对图像每个像素建立模型,所以算法的更新速度跟不上物体的变化,产生了滞......
  • m基于混合高斯模型和帧间差分相融合的自适应视频背景提取算法matlab仿真
    1.算法仿真效果matlab2013b仿真结果如下: 混合高斯模型背景提取:          利用混合高斯模型处理这段视频,黑车已经运动离开画面左下角时,左下角仍然有黑车,这种现象我们称为“鬼影”。其产生的原因是由于混合高斯模型是对图像每个像素建立模型,所以算法的更新速度......
  • 方差分析中的“元”和“因素”是什么?
    试验中要考察的指标称为试验指标,影响试验指标的条件称为因素,因素所处的状态称为水平(通常用于3个或更多水平时;如果只有2个水平考虑T-test);若试验中只有一个因素改变则称为单因素试验,若有两个因素改变则称为双因素试验,若有多个因素改变则称为多因素试验。方差分析就是对试验数据进......