• 杭电2094--产生冠军(拓扑排序)


    产生冠军

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 11549    Accepted Submission(s): 5360


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

     

    Input
    输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。
     

     

    Output
    对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。
     

     

    Sample Input
    3
    Alice Bob
    Smith John
    Alice Smith
    5
    a c
    c d
    d e
    b e
    a d
    0
     

     

    Sample Output
    Yes
    No
     

     

    Author
    qianneng
     

     

    Source
     

     

    Recommend
    lcy   |   We have carefully selected several similar problems for you:  2093 1811 2086 2647 2090 
    RE: 据说一场没输过的就是赢家。
     1 #include <map>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 using namespace std;
     6 map<string, int> acc;
     7 int vis[1010], pic[1010][1010], indegree[1010];
     8 bool flag;
     9 int n, k, top; 
    10 void Deal()
    11 {
    12         memset(vis, 0, sizeof(vis));
    13         memset(pic, 0, sizeof(pic));
    14         memset(indegree, 0, sizeof(indegree));
    15         acc.clear(); string a, b; k = 0;
    16         for(int i = 0; i < n; i++)
    17         {
    18             cin >> a >> b;
    19             if(!acc[a]) acc[a] = ++k;
    20             if(!acc[b]) acc[b] = ++k;
    21             if(pic[acc[a]][acc[b]] == 0)
    22             {
    23                 pic[acc[a]][acc[b]] = 1;
    24                 indegree[acc[b]]++;    
    25             }    
    26         }
    27         int total = 0;    
    28         for(int i = 1; i <= k; i++)
    29             if(!indegree[i])
    30                 total++;
    31         if(total != 1)
    32             flag = false;
    33 }
    34 void Tsort()
    35 {
    36     top = 0;  int i; 
    37     while(top < k)
    38     {
    39         for(i = 1; i <= k; i++)
    40             if(!vis[i] && !indegree[i])
    41                 break;
    42         vis[i] = 1;
    43         top++;
    44         for(int j = 1; j <= k; j++)
    45             if(pic[i][j])
    46                 indegree[j]--;
    47     }
    48 } 
    49 
    50 /*void Tsort(){                                   //WA:  不能保证没输过的只有一个人。
    51     int m;
    52     for(int j = 0; j < k; j++){
    53         m  = -1;
    54         for(int i = 1; i <= k; i++)
    55             if(!indegree[i]){
    56                     m = i;
    57                     break;
    58             }
    59             if(m == -1){
    60                 flag = false;
    61                 break;
    62             }
    63             indegree[m]--;
    64             for(int i = 1; i <= k; i++){
    65                 if(pic[m][i])
    66                     indegree[i]--;
    67             }
    68     }
    69 } */
    70 
    71 int main()
    72 {
    73     while(~scanf("%d", &n), n)
    74     {
    75         flag = true;
    76         Deal();
    77         Tsort();
    78         if(top < k)          //好像是判环。
    79             flag = false;
    80         if(flag)
    81             printf("Yes
    ");
    82         else
    83             printf("No
    ");
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    mysql grant命令
    appache ab测试高并发
    转:windows下定时执行备份数据库
    linux设置定时任务
    YII学习总结6(模板替换和“拼合”)
    YII学习总结5(视图)
    YII学习总结4(cookie操作)
    把字符串转换成整数
    不用加减乘除做加法
    求1+2+3+4+...+n
  • 原文地址:https://www.cnblogs.com/soTired/p/4731025.html
Copyright © 2020-2023  润新知