图和树(中)Floyd——warshall

本文介绍了Floyd-Warshall算法,用于解决图论中的最短路径问题。该算法通过动态规划求得图中任意两点之间的最短路径,并能应用于求解图的传递闭包。在游戏场景中,当存在胜负关系的传递性时,Floyd-Warshall可以确定哪些比赛结果是确定的,哪些是不确定的。算法的时间复杂度为O(n^3)。

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,关系不明确,否则有胜负关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值