简单的 Floyd 算法模型

*基本思想:传递闭包

所谓传递性,可以这样理解:对于一个节点i,如果j能到i,i能到k,那么j就能到k。求传递闭包,就是把图中所有满足这样传递性的节点都弄出来,计算完成后,我们也就知道任意两个节点之间是否相连。 

  • 初始化

1. 将不可以直接到达的距离(map[i][j])设为 inf (0x3f3f3f3f)

*不设为 int_MAX 是因为使用 0x3f3f3f3f 可以使用 memset() 设置,且两个 inf 相加也不会超出范围。

2. 自己到自己到距离仍为 0.

3. 若 i 可直接到达 j,直接到达的距离即为 map[i][j]

【使用邻接矩阵】

 

*一般初始化

for(i=1;i<=n;i++)   
 for(j=1;j<=n;j++)   
     if(i==j) e[i][j]=0;   
        else e[i][j]=inf;
           

 

 

*双向图初始化

 

 t[p1][p2]=p3;
 t[p2][p1]=p3;//双向边 

 

 

 

 

  • 核心

http://developer.51cto.com/art/201403/433874.htm (参考)

核心代码:

for (int k=1;k<=n;k++) // 中转站的枚举
    for (int i=1;i<=n;i++) // 起点
        for (int j=1;j<=n;j++) // 终点
            if(e[i][j]>e[i][k]+e[k][j])   // 若经过此中转站距离小 
                   e[i][j]=e[i][k]+e[k][j];  // 将 i 到 j 最小距离更改

 

posted @ 2018-02-11 09:36  soulwinter  阅读(266)  评论(0编辑  收藏  举报