Floyed算法

Posted zhmlzhml

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Floyed算法相关的知识,希望对你有一定的参考价值。

(原来弗洛伊德不止是写xhs<梦的解析>啊哈哈哈哈)

嘿嘿

(好哦不是一个人)

 

求任意两点之间的最短路径

有些城市之间有公路,有些城市之间则没有请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。

根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即a->k->b,才可能缩短原来从顶点a点到顶点b的路程。那么这个中转的顶点k是1~n中的哪个点呢?甚至有时候不只通过一个点,而是经过两个点或者更多点中转会更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。

其实说白了,就是把所有中转遍历一下,找找最短的.
 
存数:
现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储。比如1号城市到2号城市的路程为2,则设e[1][2]的值为2。2号城市无法到达4号城市,则设置e[2][4]的值为∞。另外此处约定一个城市自己是到自己的也是0,例如e[1][1]为0.
1 核心代码:
2 for(k=1;k<=n;k++)
3     for(i=1;i<=n;i++)
4     for(j=1;j<=n;j++)
5     if(e[i][j]>e[i][k]+e[k][j])
6                      e[i][j]=e[i][k]+e[k][j];

 

整体代码:
标注:所有值初始值为正无穷  0xffffffff 或者直接找个比较大的值就好
 1 #include
 2     int main()
 3     {
 4     int e[10][10],k,i,j,n,m,t1,t2,t3;
 5     int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
 6     //读入n和m,n表示顶点个数,m表示边的条数
 7         scanf("%d %d",&n,&m);
 8     //初始化
 9     for(i=1;i<=n;i++)
10     for(j=1;j<=n;j++)
11     if(i==j) e[i][j]=0;
12     else e[i][j]=inf;
13     //读入边
14     for(i=1;i<=m;i++)
15         {
16             scanf("%d %d %d",&t1,&t2,&t3);
17             e[t1][t2]=t3;
18         }
19     //Floyd-Warshall算法核心语句
20     for(k=1;k<=n;k++)
21     for(i=1;i<=n;i++)
22     for(j=1;j<=n;j++)
23     if(e[i][j]>e[i][k]+e[k][j] )
24                         e[i][j]=e[i][k]+e[k][j];
25     //输出最终的结果
26     for(i=1;i<=n;i++)
27         {
28     for(j=1;j<=n;j++)
29             {
30                 printf("%10d",e[i][j]);
31             }
32             printf("
");
33         }
34     return 0;
35     }

注意:负权值没有最短路!!!!!!!

(负权值就是说,有条路的长度是个负数)

因为负数的话会一直递归减少,所以是不行的!!!!

以上是关于Floyed算法的主要内容,如果未能解决你的问题,请参考以下文章

floyed一个总是讲不清楚的算法

Floyed算法 O(N3) x

最短路径算法

图论最短路径Floyed算法和Dijkstra算法

图论 最短路径算法 1.Floyed-Warshall算法

Floyed-Warshall算法(求任意两点间最短距离)