HDU 产生冠军 2094

解题思路:这题重在分析,可能你知道的越多,这题想得越多,什么并查集,什么有向图等。

   事实是,我们会发现,只要找到一个,并且仅有一个的入度为0的点,说明可以找出

      冠军。若入度为0的点一个都没有,说明每个选手都是输过的;若入度为0的点超过一个,

     说明多个对应的入度为0的点的关系是不确定的,也不能产生冠军。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 #define N 1005
 6 char s1[N], s2[N], str[N][N];
 7 int vis[N], cnt;
 8
 9 int Change(char s[])
10 {
11     int i;
12     for(i = 0; i < cnt; i++)
13     {
14         //如果此字符串之前出现过,直接返回之间对应的标号。
15         if(strcmp(str[i], s) == 0) return i;
16     }
17     //如果此字符串之前没有出现过,则先将其存入字符数组中。
18     if(i == cnt) strcpy(str[cnt++], s);
19     return i;
20 }
21 int main()
22 {
23     int n;
24     while(~scanf("%d", &n) && n)
25     {
26         memset(vis, 0, sizeof(vis));//注意初始化
27         cnt = 0;
28         while(n--)
29         {
30             scanf("%s %s", s1, s2);
31             int p1 = Change(s1);
32             int p2 = Change(s2);
33             vis[p2] = 1;
34         }
35         int cnt1 = 0;
36         for(int i = 0; i < cnt; i ++) //这里的<符号是不能为<=符号的
37         {
38             if(vis[i] == 0) cnt1 ++; //如果出现入度为0的,加1
39             //printf("vis[%d] = %d\n", i, vis[i]); //打印出来有利于debug
40             if(cnt1 > 1) break;
41         }
42         if(cnt1 == 1) printf("Yes\n"); //有且只有一个入度为0的,说明找出冠军。
43         else printf("No\n");
44     }
45     return 0;
46 }

时间: 2024-10-13 15:45:58

HDU 产生冠军 2094的相关文章

图论进阶题目分类

今天在wind里看到他刷的图论进阶 于是我把他的也摘了过来 尽量刷吧 我只写了题号 HDU 1213 1272 1325&&poj1308 1856 1102 1232 1233 1863 1875 1879 3371 1301 1162 1198 1598 1811 3926 3938 2489 4081 4126 1829&&poj2492 1558 3461 3367 2473 3172 3635 3047 3038 2818 3234 2121 4009 3311

HDU 2094 产生冠军 (字典树+拓扑)

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8591    Accepted Submission(s): 4047 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打

题解报告:hdu 2094 产生冠军

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C. 如果A打败了B,B又打败了C,而且,C又打败了A,那么A.B.C三者都不可能成为冠军. 根据这个规则,无需循环较量,或许就能确定冠军.你的任务就是面对一群比赛选手,在经过了若干场撕杀

HDU 2094 产生冠军 hash 水题

Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C.如果A打败了B,B又打败了C,而且,C又打败了A,那么A.B.C三者都不可能成为冠军.根据这个规则,无需循环较量,或许就能确定冠军.你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军. Input 输入含有一些选手群,每群选手都以一个整数n(n<1000)开头

hdu 2094 产生冠军

题意:给出n对选手姓名,每对表示前者赢后者,求整场比赛是否有冠军: 思路:将名字用数字表示,离散化,然后就是裸裸的拓扑排序,只需判断初始时入度为0的是否唯一: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,i,j,k,con; int mm[1001][1001],indegree[500010]; char s1[500010],s2[500010

HDU 2094产生冠军(拓扑排序)

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10374    Accepted Submission(s): 4857 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能

HDU ACM 2094 产生冠军

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10540    Accepted Submission(s): 4929 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能

HDU 找到唯一的冠军

产生冠军 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C.如果A打败了B,B又打败了C,而且,C又打败了A,那么A.B.C三者都不可能成为冠军.根据这个规则,无需循环较量,或

HDU 2094 拓扑排序

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12031    Accepted Submission(s): 5583 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能