(一)Floyed算法是解决赋权图最短路问题的.
(二)算法的基本思想:
利用图论中的传递关系,更新任意两点间的最短距离。
(三)时间复杂度高。
(四)算法的核心代码
1 for(k=1;k<=n;k++)
2 for(i=1;i<=n;i++)
3 for(j=1;j<=n;j++) {
4 if(d[i][k]+d[k][j]<d[i][j]) {
5 d[i][j]=d[i][k]+d[k][j];
6 path[i][j]=path[i][k];
7 }
8 }
(五)C++完整代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #define max 1000000000
4
5 int d[1000][1000],path[1000][1000];
6 int main()
7 {
8 int i,j,k,m,n;
9 int x,y,z;
10 scanf("%d%d",&n,&m);
11
12 for(i=1;i<=n;i++)
13 for(j=1;j<=n;j++){
14 d[i][j]=max;
15 path[i][j]=j;
16 }
17
18 for(i=1;i<=m;i++) {
19 scanf("%d%d%d",&x,&y,&z);
20 d[x][y]=z;
21 d[y][x]=z;
22 }
23
24 for(k=1;k<=n;k++)
25 for(i=1;i<=n;i++)
26 for(j=1;j<=n;j++) {
27 if(d[i][k]+d[k][j]<d[i][j]) {
28 d[i][j]=d[i][k]+d[k][j];
29 path[i][j]=path[i][k];
30 }
31 }
32 int f, en;
33 scanf("%d%d",&f,&en);
34 int ans = 0,p;
35 while (f!=en) {
36 printf("%d->",f);
37 p = path[f][en];
38 ans += d[f][p];
39 f=path[f][en];
40 }
41 printf("%d
%d",en,ans);
42 return 0;
43 }