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;
}
posted @ 2025-02-19 14:42  郭轩均  阅读(30)  评论(0)    收藏  举报