P5960 【模板】差分约束(spfa)


由于题目没有说是连通图,所以最开始时要把所有点加入队列
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct node {
int id;
int dis;
};
const int N=5*1e4;
#define int long long
int cnt[N];
int w[N];
int vis[N];
vector<node>vi[N];
int n,m;
bool spfa(){
queue<int>q;
for(int i=1;i<=n;i++){
q.push(i);
vis[i]=1;
}
for(int i=1;i<=n;i++)w[i]=1e9;
w[1]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<vi[u].size();i++){
int v=vi[u][i].id;
if(w[u]+vi[u][i].dis<w[v]){
w[v]=w[u]+vi[u][i].dis;
cnt[v]=cnt[u]+1;
if(cnt[v]>=n-1){
return 0;
}
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
return 1;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int c1,c2,y;
cin>>c1>>c2>>y;
vi[c1].push_back({c2,y});
}
if(spfa())for(int i=1;i<=n;i++)cout<<-w[i]<<" ";
else cout<<"NO";
return 0;
}

浙公网安备 33010602011771号