差分约束学习笔记
先放出来例题传送门
给出一组包含
的不等式组,求任意一组满足这个不等式组的解。
因为
看到
但众所周知,有负权环的图是没有最短路的。所以跑的时候还要判是否有负权环,有则无解。
然后就可以写出代码:
点击查看代码
int n,m,dis[N],cnt[N];
int tot,head[N];struct node{int to,nxt,cw;}e[N];
inline void add(int u,int v,int w){e[++tot]={v,head[u],w},head[u]=tot;}
queue<int> q;
void solve(){
scanf("%d%d",&n,&m);
for(int i=1,u,v,w;i<=m;i++){
scanf("%d%d%d",&v,&u,&w);
add(u,v,w);
}
for(int i=1;i<=n;i++)dis[i]=infi,add(0,i,0);
q.push(0);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[u]+e[i].cw<dis[v]){
dis[v]=dis[u]+e[i].cw;
cnt[v]++;
if(cnt[v]>n)printf("NO"),exit(0);
q.push(e[i].to);
}
}
}
for(int i=1;i<=n;i++)printf("%d ",dis[i]);
}
signed main(){
int t=1;
// scanf("%d",&t);
while(t--)solve();
}
拓展:
-
将两边同时乘上 ,变为 ,即从 向 连一条长度为 的边。 -
变为 即可。