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 }

 

posted @ 2018-10-11 20:43  huluxin  阅读(322)  评论(0编辑  收藏  举报