负环与差分约束
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)
必要时,建一个超级源点
以上是关于负环与差分约束的主要内容,如果未能解决你的问题,请参考以下文章