#P3660. Cow Contest
Cow Contest
题目描述
有 头奶牛(),编号为 到 ,正在参加一场编程比赛。众所周知,有些奶牛的编程水平比另一些更高。每头奶牛都有一个固定且唯一的技能评分。
比赛采用两两对决的形式进行,共进行 轮()。如果奶牛 的技能评分高于奶牛 (;;),那么 必定能战胜 。
农夫约翰希望根据比赛结果对所有奶牛进行技能排名。给定 轮比赛的结果,请计算有多少头奶牛的排名可以被唯一确定(即可以明确知道它在所有奶牛中的具体名次)。题目保证比赛结果不会自相矛盾。
输入格式
- 第 1 行:两个整数 和 ,分别表示奶牛数量和比赛轮数。
- 第 2 行到第 行:每行包含两个整数 和 ,表示该轮比赛的结果( 战胜了 )。
输出格式
- 第 1 行:一个整数,表示排名可以唯一确定的奶牛数量。
样例输入 1
5 5
4 3
4 2
3 2
1 2
2 5
样例输出 1
2
样例解释
- 奶牛 输给了 、、,且战胜了 ,因此它的排名一定是第 (倒数第二)。
- 奶牛 输给了 ,且没有其他比赛记录,因此它的排名一定是第 (最后一名)。
- 其他奶牛(、、)的比赛结果不足以唯一确定它们的排名,因此输出 。
题目来源
USACO 2008 January Silver
补充说明
-
排名唯一确定的条件:
- 如果奶牛 的技能评分严格高于 头奶牛,并且严格低于 头奶牛,那么它的排名就是 。
- 即必须明确知道有多少奶牛比它强,多少奶牛比它弱。
-
算法思路:
- 使用 Floyd-Warshall 算法或 DFS/BFS 计算每头奶牛的胜负传递闭包。
- 对于每头奶牛 ,统计:
- 比它强的奶牛数量(能间接战胜它的奶牛)
- 比它弱的奶牛数量(它能间接战胜的奶牛)
- 如果两者之和等于 ,则它的排名可以唯一确定。
-
数据范围:
- 较小(),因此 的 Floyd-Warshall 算法完全可行。