对于前面说到的最短路径的求解方法,不能解决负权边的情况,而Bellman-Ford却可以
共有n个顶点,m条边,每次输入u[i],v[i],w[i],代表从u[i]到v[i]的距离是w[i],对于所有的顶点进行n-1次松弛
还是直接看代码吧
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int inf=0x3f3f3f3f; 7 int main() 8 { 9 int m,n,u[100],v[100],w[100],dis[100]; 10 while(cin>>n>>m){ 11 for(int i=1;i<=n;i++){ 12 dis[i]=inf; 13 } 14 for(int i=1;i<=m;i++){ 15 cin>>u[i]>>v[i]>>w[i]; 16 } 17 dis[1]=0; 18 for(int k=1;k<=n-1;k++){ 19 for(int i=1;i<=m;i++){ 20 if(dis[v[i]]>dis[u[i]]+w[i]) 21 dis[v[i]]=dis[u[i]]+w[i]; 22 } 23 } 24 for(int i=1;i<=n;i++) 25 cout<<dis[i]<<" "; 26 } 27 } 28 29 30 /* 31 5 5 32 2 3 2 33 1 2 -3 34 1 5 5 35 4 5 2 36 3 4 3 37 输出:0 -3 -1 2 4 38 */
时间: 2024-09-29 12:16:08