题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1874
在本题目中运用两种最短路算法来解决实际问题
在弗洛伊德算法中判断是否是负循环只需要判断i==j的情况下的数是否为-1即可。
1、迪杰斯特拉算法
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 const int MAX_N = 1010; 5 const int INF = 0x3f3f3f3f; 6 bool v[MAX_N]; 7 int l[220]; 8 int c[220][220]; 9 int n,m; 10 void Ds(int x) 11 { 12 for (int i = 0; i < n; i++) 13 { 14 l[i] = INF; 15 v[i] = false; 16 } 17 l[x] = 0; 18 for (int j = 0; j < n; j++) 19 { 20 int k = -1; 21 int minv = INF; 22 for (int i = 0; i < n; i++) 23 { 24 if (!v[i] && l[i] < minv) 25 { 26 minv = l[i]; 27 k = i; 28 } 29 } 30 if (k == -1) 31 { 32 break; 33 } 34 v[k] = true; 35 for (int i = 0; i < n; i++) 36 { 37 if (!v[i] && l[k] + c[k][i] < l[i]) 38 { 39 l[i] = l[k] + c[k][i]; 40 } 41 } 42 } 43 } 44 int main() 45 { 46 while(cin>>n>>m) 47 { 48 memset(c,INF,sizeof(c)); 49 for(int i=0; i<m ;i++) 50 { 51 int A,B,X; 52 cin>>A>>B>>X; 53 c[A][B]=min(c[A][B],X); 54 c[B][A]=min(c[A][B],X); 55 } 56 int S,T; 57 cin>>S>>T; 58 Ds(S); 59 if(l[T]==INF) 60 { 61 cout<<"-1"<<endl; 62 } 63 if(l[T]!=INF) 64 cout<<l[T]<<endl; 65 } 66 }
2、弗洛伊德算法
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 #define inf 0x3f3f3f3f 7 8 int map1[300][300]; 9 int main() 10 { 11 int n,m; 12 while(cin>>n>>m) 13 { 14 for(int i=0;i<n;i++) 15 { 16 for(int j=0;j<n;j++) 17 { 18 if(i==j) 19 { 20 map1[i][j]=0; 21 } 22 else 23 map1[i][j]=inf; 24 } 25 } 26 int a,b,c; 27 for(int i=0;i<m;i++) 28 { 29 cin>>a>>b>>c; 30 map1[a][b]=min(map1[a][b],c); 31 map1[b][a]=min(map1[b][a],c); 32 } 33 for(int k=0;k<n;k++) 34 { 35 for(int i=0;i<n;i++) 36 { 37 for(int j=0;j<n;j++) 38 { 39 if(map1[i][j]>map1[i][k]+map1[k][j]) 40 { 41 map1[i][j]=map1[i][k]+map1[k][j]; 42 } 43 } 44 } 45 } 46 int s,t; 47 cin>>s>>t; 48 if(map1[s][t]==inf) 49 { 50 cout<<-1<<endl; 51 } 52 else 53 cout<<map1[s][t]<<endl; 54 } 55 56 return 0; 57 }