-1
if(e[t1][t2]>t3)///两点之间有多条路的话避免被覆盖选最短的一个 { e[t1][t2]=t3;///这里说的是双向的最短路 e[t2][t1]=t3;///双向,如果是单向的这句可以省略 } }
///F 畅通工程续 ///Floyd-Warshall允许经过1-n号所有顶点进行中转求得任意两点间的最短路程 #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <cstdio> using namespace std; const int maxx=210; const int inf=99999999; int e[maxx][maxx]; int n,m; int main() { while(~scanf("%d %d",&n,&m)) { for(int i=0; i<=n; i++) { for(int j=0; j<n; j++) { if(i==j) e[i][j]=0; ///初始化 else e[i][j]=inf; } } for(int i=0; i<m; i++) { int t1,t2,t3; scanf("%d %d %d",&t1,&t2,&t3); if(e[t1][t2]>t3)///两点之间有多条路的话避免被覆盖选最短的一个 { e[t1][t2]=t3;///这里说的是双向的最短路 e[t2][t1]=t3;///双向,如果是单向的这句可以省略 } } ///下面是Floyd-warshall核心代码 for(int k=0; k<n; k++ ) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(e[i][j]>e[i][k]+e[k][j]) { e[i][j]=e[i][k]+e[k][j]; } } } } int x,y; scanf("%d %d",&x,&y); if(e[x][y]==inf) ///如果两者之间没有路则输出-1 printf("-1\n"); else printf("%d\n",e[x][y]); } return 0; }