求助 就A了最后一个点
#include <bits/stdc++.h>
using namespace std;
struct Edge{
int next,to,w;
}edge[10000];
int h[10000];
int cnt;
int ccnt[10000];
int n,m;
void addEdge(int u,int v,int w){
cnt++;
edge[cnt].next=h[u];
edge[cnt].to=v;
edge[cnt].w=w;
h[u]=cnt;
}
int vis[10000],dis[10000];
bool spfa(int u){
queue<int>q;
memset(vis,0,sizeof vis);
vis[u]=1;
for(int i=1;i<=n;i++) dis[i]=1e9;
dis[u]=0;
q.push(u);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=h[u];i;i=edge[i].next){
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].w){
dis[v]=dis[u]+edge[i].w;
if(!vis[v]){
vis[v]=1,ccnt[v]++;
if(ccnt[v]>n+1) return 0;
q.push(v);
}
}
}
}
return 1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
addEdge(0,i,0);
}
for(int i=1;i<=m;i++){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
addEdge(y,x,k);
}
if(!spfa(0)) puts("NO");
else {
for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
}
}