可以有负环。
遍历每一条边n-1次,同时更新dis(若无负环则最短路径长度不超过n-1)
#include<stdio.h>
#include<stdlib.h>
#define size 100000
#define sup 0Xffffff0
struct edge {
int u;
int v;
int w;
};
typedef struct edge edge;//边
edge all[size];
int cnt, dis[size];
void insert(int u, int v, int w) {//插入
all[cnt].u = u, all[cnt].v = v, all[cnt].w = w;
++cnt;
}
void initial(int n, int s) {//初始化
for (int i = 1; i <= n; i++) {
dis[i] = sup;
}
dis[s] = 0;
}
int Bellman_Ford(int n, int m, int s) {
int i, j, k, u, v, w;
initial(n, s);
for (i = 0; i < n - 1; i++) {
for (j = 0; j < m; j++) {
u = all[j].u, v = all[j].v, w = all[j].w;
dis[v] = dis[u] + w > dis[v] ? dis[v] : dis[u] + w;
}
}
for (i = 0; i < m; i++) {
u = all[j].u, v = all[j].v, w = all[j].w;
if (dis[u] + w < dis[v])return 1;//存在负环
}
}
int main() {
int n, m, i, s;
int u, v, w;
scanf("%d%d%d", &n, &m, &s);
for (i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
insert(u, v, w);
}
Bellman_Ford(n, m, s);
for (i = 1; i <= n; i++)printf("%d ", dis[i]);
}