题目描述
有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果 A 打败了 B ,B 又打败了 C ,而 A 与 C 之间没有进行过比赛,那么就认定,A 一定能打败 C 。
如果 A 打败了 B ,B 又打败了 C ,而且,C 又打败了 A,那么 A、B、C 三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,
确定是否已经实际上产生了冠军。
输入格式
输入含有一些选手群,每群选手都以一个整数 $n(n<1000)$ 开头,后跟 $n$ 对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果 $n$ 为 $0$,则表示输入结束。
输出格式
对于每个选手群,若你判断出产生了冠军,则在一行中输出“$Yes$”,否则在一行中输出“$No$”。
样例 #1
样例输入 #1
```
3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0
```
样例输出 #1
```
Yes
No
```
解释
1、数据结构:
set<string> win
用于存储当前尚未输过比赛的选手
set<string> los
用于存储已经输过比赛的选手
2、逻辑:
对于每一场比赛,选手 a
胜利,选手 b
失败
将选手 b
加入 los
集合中,如果 a
不在 los
集合中,则 a
可能是赢家,加入 win
集合
如果选手 b
之前在 win
集合中,移除它,因为选手 b
现在已经输了比赛
3、判断:
最后,检查 win
集合中是否只剩下一个选手,如果是,则该选手是唯一的赢家,输出 Yes
;否则,输出 No
这段代码的核心是通过维护两个集合来跟踪比赛的输赢情况,从而找出唯一的赢家