思路:差分约束模板题,注意使用SPFA来判断负环,也即无解的情况。
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 5005
#define ll long long
int n,m,dis[maxn],cnt[maxn];
bool vis[maxn];
queue<int> que;
struct node{
int to,val;
node(int to,int val):to(to),val(val){}
};
vector<node> q[maxn];
bool SPFA(int start,int n){
memset(dis,127,sizeof(dis));
dis[start]=0;
que.push(start);
while(!que.empty()){
int now=que.front();
que.pop();
if(cnt[now]==n)
return false;
vis[now]=false;
for(int i=0;i<q[now].size();i++){
int v=q[now][i].to;
if(dis[v]>dis[now]+q[now][i].val){
dis[v]=dis[now]+q[now][i].val;
if(!vis[v]){
vis[v]=true;
que.push(v);
cnt[v]++;
}
}
}
}
return true;
}
int main(void){
int x,y,w;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&w);
q[y].push_back(node(x,w));
}
for(int i=1;i<=n;i++)
q[0].push_back(node(i,0));
if(SPFA(0,n)){
for(int i=1;i<n;i++)
printf("%d ",dis[i]);
printf("%d\n",dis[n]);
}
else
printf("NO\n");
return 0;
}