zoukankan      html  css  js  c++  java
  • 杭电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 }
  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/soTired/p/4731025.html
Copyright © 2011-2022 走看看