*基本思想:传递闭包
所谓传递性,可以这样理解:对于一个节点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 最小距离更改