时间复杂度O(v^3),可以处理负边。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 using namespace std; 10 int d[250][250]; 11 int main(int argc, char *argv[]) 12 { 13 int n,m; 14 while(scanf("%d%d",&n,&m)!=EOF) 15 { 16 for(int i=0;i<=n;i++) 17 for(int j=0;j<=n;j++) 18 { 19 if(i==j) 20 d[i][j]=0; 21 else 22 d[i][j]=1e9; 23 } 24 for(int i=0;i<m;i++) 25 { 26 int x,y,z; 27 scanf("%d%d%d",&x,&y,&z); 28 d[x][y]=min(d[x][y],z); 29 d[y][x]=min(d[y][x],z); 30 } 31 int s,t; 32 scanf("%d%d",&s,&t); 33 for(int k=0;k<n;k++) 34 for(int i=0;i<n;i++) 35 for(int j=0;j<n;j++) 36 d[i][j]=min(d[i][j],d[i][k]+d[k][j]); 37 if(d[s][t]==1e9) 38 printf("-1"); 39 else 40 printf("%d",d[s][t]); 41 printf("\n"); 42 } 43 return 0; 44 }