1 #include<stdio.h>
 2 int dis[601][601];
 3 int path[601][601];
 4 void floyd(int n)
 5 {
 6     for(int k=1;k<=n;k++)
 7     {
 8         for(int i=1;i<=n;i++)
 9         {
10             for(int j=1;j<=n;j++)
11             {
12                 printf("d[%d][%d]=%d ",i,j,dis[i][j]);
13                 printf("d[%d][%d]=%d d[%d][%d]=%d\n",i,k,dis[i][k],k,j,dis[k][j]);
14                 
15                 if(dis[i][k]+dis[k][j]<dis[i][j])
16                 {
17                     dis[i][j]=dis[i][k]+dis[k][j];
18                     printf("%d\n\n",dis[1][2]);
19                     path[i][j]=path[k][j];
20                 }
21             }
22         }
23     }
24 }
25 
26 
27 void find(int a,int b)
28 {
29     int p[100],k=0;
30     p[k++]=b;
31     while(path[a][b]!=a)
32     {
33         p[k++]=path[a][b];
34         b=path[a][b];
35     }
36     p[k++]=a;
37     for(int i=k-1;i>=0;i--)
38     {
39         if(i!=0)
40         printf("%d -> ",p[i]);
41         else
42             printf("%d\n",p[i]);
43     }
44     printf("%d",dis[1][2]);
45     printf("\n");
46 }
47 int main()
48 {
49     int n,m;
50     scanf("%d %d",&n,&m);
51     int a,b,k,i,j;
52     for(i=1;i<=n;i++)
53         for(j=1;j<=n;j++)
54         {
55             path[i][j]=i;
56             dis[i][j]=100000;
57         }
58     for(i=1;i<=m;i++)
59     {
60         scanf("%d %d %d",&a,&b,&k);
61         dis[a][b]=dis[b][a]=k;
62     }
63     floyd(n);
64     find(1,2);
65     return 0;
66 }
floyd算法实现示例代码

相关文章: