题意:
N 个人玩一个游戏,每两个人都要进行一场比赛,已知M个胜负关系,每个关系为AB,表示A比B强, 胜负关系具有传递性,试问有多少场比赛的胜负无法预先得知?(1≤𝑁,𝑀≤500)
输入:
第一行给出数据组数。
每组数据第一行给出 N 和 M(N , M <= 500)。
接下来 M 行,每行给出 A B,表示 A 可以胜过 B。
输出:
对于每一组数据,判断有多少场比赛的胜负不能预先得知。注意 (a, b) 与 (b, a) 等价,即每一个二元组只被计算一次。
输入样例:
3
3 3
1 2
1 3
2 3
3 2
1 2
2 3
4 2
1 2
3 4
输出样例:
0
0
4
解题思路:
由 1 ≤ 𝑁, 𝑀 ≤ 500 的数据规模可以得知本题要求复杂度为𝑂(𝑛^3),因为胜负关系具有传递性,因此可以用 Floyd 算法求出任意两点的胜负关系(传递闭包),即可求出答案。𝑑𝑖𝑠[𝑎][𝑏]= 1 表示a比b强,𝑑𝑖𝑠[𝑎][𝑏] =0表示a与b的胜负关系不明,𝑑𝑖𝑠[𝑎][𝑏]=0且𝑑𝑖𝑠[b][a] =0即表示a与b的胜负 关系无法预先判断。
注意事项:
floyd算法可用于求取图中任意两点之间的关系,这样的关系包括多源最短路,任意两点的距离关系以及图上的传递闭包,任意两点的连通关系。复杂度为 𝑂(𝑛^3)。当所求为距离关系时的floyd算法为:
当所求为点的连通关系时的floyd算法为:
可以进行的优化是在于dis[i][k]为0时dis[i][k]&dis[k][j]一定为0,此时不需要进入到第三个循环当中,如下:
总结:
一道关于应用floyd算法求解图中两点连通关系的题目,注意floyd算法用于求解图中任意两点的距离关系以及图上任意两点的连通关系时的细微差异。并配合一定的优化剪枝提升算法的效率。注意对于多组输入数据的程序公共变量一定要在每次运行前初始化,避免因为保留了旧值而出错。floyd算法参数中
Floyd Algorithm
最新推荐文章于 2024-08-29 17:29:00 发布