Floyd模板(带路径记忆)
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 #include <iomanip> 10 using namespace std; 11 int next[105][105]; 12 int n,m; 13 int g[105][105]; 14 void init() 15 { 16 for(int i=0;i<=n;i++) 17 { 18 for(int j=0;j<=n;j++) 19 { 20 if(i==j) 21 g[i][j]=g[j][i]=0; 22 else 23 g[i][j]=g[j][i]=1e9; 24 } 25 } 26 } 27 void printpath() 28 { 29 int st=1,ed=n; 30 while(st!=ed) 31 { 32 printf("%d->",st); 33 st=next[st][ed]; 34 } 35 printf("%d",ed); 36 } 37 void floyd() 38 { 39 for(int i=1;i<=n;i++) 40 { 41 for(int j=1;j<=n;j++) 42 { 43 next[i][j]=j; 44 } 45 } 46 for(int k=1;k<=n;k++) 47 { 48 for(int i=1;i<=n;i++) 49 { 50 for(int j=1;j<=n;j++) 51 { 52 if(g[i][j]>g[i][k]+g[k][j]) 53 { 54 g[i][j]=g[i][k]+g[k][j]; 55 next[i][j]=next[i][k]; 56 } 57 58 } 59 } 60 } 61 printf("%d\n",g[1][n]); 62 printpath(); 63 } 64 int main(int argc, char *argv[]) 65 { 66 67 scanf("%d%d",&n,&m); 68 init(); 69 for(int i=0;i<m;i++) 70 { 71 int x,y,w; 72 scanf("%d%d%d",&x,&y,&w); 73 if(g[x][y]>w) 74 g[x][y]=g[y][x]=w; 75 } 76 floyd(); 77 return 0; 78 }