HDU 2094产生冠军(map)
2012-08-02 20:45
351 查看
产生冠军
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4952 Accepted Submission(s): 2364
[align=left]Problem Description[/align]
有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
[align=left]Input[/align]
输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。
[align=left]Output[/align]
对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。
[align=left]Sample Input[/align]
3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0
[align=left]Sample Output[/align]
Yes
No
View Code
#include<iostream> #include<string> #include<map> #include<utility> #include<stdio.h> #include<string.h> using namespace std; map<string,int> f; int de[2005]; int main() { int n,p,i,num; string str1,str2; while(~scanf("%d%*c",&n)) { if(n==0) break; memset(de,0,sizeof(de)); f.clear(); p=0; for(i=1;i<=n;i++) { cin>>str1>>str2; if(!f[str1])//未映射之前f[str]=0; { p++; f[str1]=p; } if(!f[str2]) { p++; f[str2]=p; } de[f[str2]]++; } num=0; for(i=1;i<=p;i++) { if(de[i]==0) num++; } if(num==1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- HDU 2094 产生冠军(map)
- HDU 2094 产生冠军(水题 map使用)
- hdu-2094-产生冠军(map&拓扑)
- HDU 2094 产生冠军 map
- HDU 2094 产生冠军 dfs加map容器
- HDU 2094 产生冠军 (map)
- HDU 2094 产生冠军
- HDU-2094-产生冠军(简单模拟)
- hdu 2094 产生冠军(拓扑排序)
- HDU 产生冠军 2094
- hdu 2094 产生冠军 (set)
- HDU 2094 产生冠军
- HDU 产生冠军 2094
- HDU 2094 产生冠军
- HDU 2094 产生冠军
- HDU 2094 产生冠军
- hdu 2094 产生冠军
- HDU 2094 产生冠军
- HDU 2094 产生冠军
- 产生冠军 HDU - 2094