Floyd算法 及其运用

 

 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算法实现示例代码

 

 

h

         通过一个图的权值矩阵求出它的每两点间的最短路径矩阵
Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离

 

 

 

 
posted @ 2013-12-06 22:47  陈泽泽  阅读(691)  评论(0编辑  收藏  举报