ACM訓練-floyd算法

問題描述:多源點問題和負權值圖的最短路徑算法

算法描述:Floyd算法是一個經典的動態規劃算法。從任意節點i到任意節點j的最短路徑不外乎2種可能,1是直接從i到j,2是從i通過若干個節點k到j。因此,咱們假設Dis(i,j)爲節點u到節點v的最短路徑的距離,對於每個節點k,咱們檢查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,若是成立,證實從i到k再到j的路徑比i直接到j的路徑短,咱們便設置Dis(i,j) = Dis(i,k) + Dis(k,j),這樣一來,當咱們遍歷完全部節點k,Dis(i,j)中記錄的即是i到j的最短路徑的距離。spa

源代碼:code

 1 #include<stdio.h>
 2 #define MAX 100000
 3 int main()
 4 {
 5     int n;
 6     int arcs[10][10],path[10][10];//pat[i][j]=k 表示從i到j會通過k  
 7     FILE *fp=fopen("floyd_data.txt","r");
 8     if(fp==NULL)
 9     {
10         printf("open file error\n");
11         return 0;
12     } 
13     scanf("%d",&n);
14     for(int i=0;i<n;i++)
15     {
16         for(int j=0;j<n;j++)
17         {
18             fscanf(fp,"%d",&arcs[i][j]);
19             path[i][j]=j; //初始化 
20         }
21     }
22     for(int k=0;k<n;k++)
23     for(int i=0;i<n;i++)
24     for(int j=0;j<n;j++)
25     if(arcs[i][k]+arcs[k][j]<arcs[i][j]) 
26     {
27         arcs[i][j]=arcs[i][k]+arcs[k][j];
28         path[i][j]=k;
29     }
30     for(int i=0;i<n;i++)
31     {
32         for(int j=0;j<n;j++)
33         {
34             printf("%d->%d:%d    ",i,j,arcs[i][j]);
35             int t=i;
36             while(t!=j)
37             {
38                 printf("%d--",t);
39                 t=path[t][j];
40             }  
41             printf("%d",t);
42             printf("\n");
43         }
44                 
45     }
46     if(fclose(fp)!=0) printf(" close file error\n");
47 }

時間複雜度:O(n³)blog

相關文章
相關標籤/搜索