负环与差分约束

Posted lhm-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了负环与差分约束相关的知识,希望对你有一定的参考价值。

判负环

(SPFA)时,设(sp\_cnt[x])表示从(x)入队次数,若更新时, (sp\_cnt[y]gt n) ,则说明图中有负环,算法正常结束,则图中无负环

bool spfa()
{
    queue<int> q;
    dis[1]=0;
    vis[1]=true;
    q.push(1);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        vis[x]=false;
        if(++sp_cnt[x]>n) return true;
        for(int i=head[x];i;i=e[i].nxt)
        {
            int y=e[i].to,v=e[i].v;
            if(dis[y]>dis[x]+v)
            {
                dis[y]=dis[x]+v;
                if(!vis[y])
                {
                    q.push(y);
                    vis[y]=true;
                }
            }
        }
    }
    return false;
}

差分约束

差分约束系统即为(n)元一次不等式组,每个约束条件都是由两个变量作差构成的,形如(x_i-x_i leqslant c_k),目标为求出一组解可以满足所有约束条件

(x_i-x_j leqslant c_k)可变形为(x_i leqslant x_j+c_k),与最短路中三角形不等式(dis[y] leqslant dis[x]+v)相似,于是将不等式组中的变量看作点,每个约束条件(x_i-x_j leqslant c_k)为从节点(i)向节点(j)连一条边权为(c_k)的有向边

在跑完最短路后,(x_i=dis[i])为差分约束系统中的一组解,若存在负环和终点不可达时,无解

(x_i-x_j geqslant c_k)变形为(x_j-x_i leqslant -c_k)

(x_i-x_j < c_k)变形为(x_i-x_j leqslant c_k-1)

(x_i-x_j > c_k)变形为(x_i-x_j geqslant c_k+1)

(x_i-x_j = c_k)变形为(x_i-x_j leqslant 0\)( x_i-x_j geqslant 0)

必要时,建一个超级源点

以上是关于负环与差分约束的主要内容,如果未能解决你的问题,请参考以下文章

G - THE MATRIX PROBLEM(差分约束&判负环优化)

差分约束系统相关证明(存在负环则无解证明)

培训补坑(day5:最小生成树+负环判断+差分约束)

差分约束

洛谷P3385 负环与SPFA算法

bzoj 1731: [Usaco2005 dec]Layout 排队布局差分约束