Floyd-Warshall
求图中任意两点之间的距离
f[k][x][y] ,只允许经过节点1-k,节点x到节点y的最短路长度
f[n][x][y],即结点x到节点y的最短路径长度
f[k][x][y] = min(f[k-1][x][y], f[k-1[x][k] + f[k-1][k][y] )
改进
f[x][y] = min(f[x][y], f[x][k] + f[k][y])
算法应用
- 求图中任意两点之间的关系
- 多元最短路,任意两点的距离关系
- 图上的传递闭包,人以两点的联通关系
- 复杂度O(n^3)
算法实现
//n: 点个数,dis:距离数组,dis[i][j]:点i到点j的距离
//中间通过第k个数到达的两点之间的最短路径
void Floyd(int x,int **dis)
{
for(int k = 1;k <= n;k++)
for(int i = 1;i <= n;i++)
for(int j =1;j <= n;j++)
dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
}
求传递闭包
题意
• N 个人玩一个游戏,每两个人都要进行一场比赛
• 已知 M 个胜负关系,每个关系为 A B,表示 A 比 B 强,
胜负关系具有传递性
• 试问有多少场比赛的胜负无法预先得知?
• 1 ≤ 𝑁, 𝑀 ≤ 500
分析;
由于胜负关系具有传递性,用Floyd算法可以求出传递闭包
dis[a][b] = 1,表示a比b强
dis[a][b] = 0表示a与b的关系不明确
dis[a][b] = 0且 dis[b][a] = 0 表示a与b之间的胜负关系不明确
跑floyd,如果dis[a][b] =0 && dis[b][a] = 0,关系不明确,否则有胜负关系
本文介绍了Floyd-Warshall算法,用于解决图论中的最短路径问题。该算法通过动态规划求得图中任意两点之间的最短路径,并能应用于求解图的传递闭包。在游戏场景中,当存在胜负关系的传递性时,Floyd-Warshall可以确定哪些比赛结果是确定的,哪些是不确定的。算法的时间复杂度为O(n^3)。
485

被折叠的 条评论
为什么被折叠?



