問題描述:多源點問題和負權值圖的最短路徑算法
算法描述: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