//Bellman-Ford 算法 #include<iostream> using namespace std; #define MAX_SIZE 100 #define MAX_NUMBER INT_MAX/2 struct Edge { int u, v; //表示有向边<u,v> int w; //边的权重 }; Edge edge[MAX_SIZE]; int dis[MAX_SIZE]; int parent[MAX_SIZE]; bool Bellman_Ford(int v, int e, int s); int main() { /*测试*/ int i,v,e, s; cin >> v >> e; for (i = 0; i<e; i++) cin >> edge[i].u >> edge[i].v >> edge[i].w; cin >> s; bool flag = Bellman_Ford(v, e, s); for (i = 0; i<v; i++) cout << dis[i] << " "; cout << endl; return 0; } void Relax(Edge edge) { if (dis[edge.v] > dis[edge.u] + edge.w) { dis[edge.v] = dis[edge.u] + edge.w; parent[edge.v] = edge.u; } } bool Bellman_Ford(int v,int e,int s) { int i,j; for (i = 0; i < v; i++) dis[i] = MAX_NUMBER; parent[s] = -1; //s设置为根结点 dis[s] = 0; for (i = 1; i < v; i++) { for (i = 0; i < e; i++) Relax(edge[i]); //对每条边做一次松弛操作 } for (i = 0; i < e; i++) { //检验路径长度是否收敛(是否有负环存在) if (dis[edge[i].v]>dis[edge[i].u] + edge[i].w) return false; } return true; }
时间: 2024-10-13 11:35:47