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 }
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的最短路径的距离