新建一个 0 号点,从 0 号点向其他所有点连一条权值为 0 的边。
若有负环则无解
P5960 【模板】差分约束算法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,tot,u,v,w,head[200005],dis[200005],cnt[200005];
struct node{
int to,w,next;
}edge[200005];
void add_edge(int from,int to,int w){
edge[++tot].to=to;
edge[tot].w=w;
edge[tot].next=head[from];
head[from]=tot;
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
add_edge(v,u,w);
}
for(int i=1;i<=n;i++)add_edge(0,i,0);
memset(dis,0x3f,sizeof(dis));
queue<int> q;
dis[0]=0;
q.push(0);
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=head[t];i;i=edge[i].next){
int to=edge[i].to,w=edge[i].w;
if(dis[to]>dis[t]+w){
dis[to]=dis[t]+w;
q.push(to);
if(++cnt[to]>n){
cout<<"NO"<<endl;
return 0;
}
}
}
}
for(int i=1;i<=n;i++)cout<<dis[i]<<' ';
return 0;
}