#include <iostream> #include <cstring> #include <cstdio> #define MAX 100 #define INF 0x3f3f3f using namespace std; //有向图 struct Edge { int u,v,cost; }e[MAX]; int dist[MAX]; //最短路径 int prev[MAX]; //路径 int m,n; //边数和顶点数 bool Bellman_Ford(int v0) { int u=v0; for(int i=1;i<=n;i++) dist[i]=INF; dist[u]=0; for(int i=1;i<=n;i++) for(int j=0;j<m;j++) if(dist[e[j].v]>dist[e[j].u]+e[j].cost) { dist[e[j].v]=dist[e[j].u]+e[j].cost; prev[e[j].v]=e[j].u; } for(int i=0;i<m;i++) if(dist[e[i].v]>dist[e[i].u]+e[i].cost) return 0; return 1; } int main() { cin>>n>>m; for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].cost; if(Bellman_Ford(1)) for(int i = 1; i <= n; ++i) //每个点最短路 { printf("%d\n", dist[i]); } else printf("have negative circle\n"); return 0; }
时间: 2024-10-21 15:49:17