zoukankan      html  css  js  c++  java
  • HDU 2094 产生冠军

                      产生冠军




    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
     
    一开始还以为是拓扑排序,原来判断入度为0的点只有一个就行了。
     
      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 #include<string>
      5 #include<algorithm>
      6 #include<map>
      7 using namespace std;
      8 
      9 map<string,int>id;
     10 int G[1005][1005];
     11 bool indegree[1005];
     12 int num;
     13 
     14 bool check()
     15 {
     16     int cnt,i;
     17     for(cnt=i=0;i<num;i++)
     18     {
     19         if(indegree[i])
     20         cnt++;
     21     }
     22     if(cnt!=num-1)return false;
     23     return true;
     24 }
     25 
     26 int main()
     27 {
     28     //freopen("in.txt","r",stdin);
     29     int n;
     30     string s1,s2;
     31     while(scanf("%d",&n),n)
     32     {
     33         num=0;
     34         id.clear();
     35         memset(indegree,0,sizeof(indegree));
     36         memset(G,0,sizeof(G));
     37         for(int i=0;i<n;i++)
     38         {
     39             cin>>s1>>s2;
     40             if(!id.count(s1))
     41                 id[s1]=num++;
     42             if(!id.count(s2))
     43                 id[s2]=num++;
     44                 if(!G[id[s1]][id[s2]])
     45                     indegree[id[s2]]=true;
     46             G[id[s1]][id[s2]]=1;
     47         }
     48         bool ans=check();
     49         if(ans)
     50             printf("Yes
    ");
     51         else
     52             printf("No
    ");
     53     }
     54     return 0;
     55 }
     56 
     57 
     58 /*判断图有唯一拓扑序列
     59 #include<cstdio>
     60 #include<iostream>
     61 #include<cstring>
     62 #include<string>
     63 #include<algorithm>
     64 #include<map>
     65 using namespace std;
     66 
     67 map<string,int>id;
     68 int G[1005][1005];
     69 bool indegree[1005];
     70 int num;
     71 int c[1005];
     72 
     73 bool dfs(int u)
     74 {
     75     c[u]=-1;
     76     for(int v=0;v<num;v++)
     77     {
     78         if(G[u][v])
     79         {
     80             if(c[v]<0)return false;
     81             else if(!c[v]&&!dfs(v))return false;
     82         }
     83     }
     84     c[u]=1;
     85     return true;
     86 }
     87 
     88 bool toposort()
     89 {
     90     int flag;
     91     int cnt,i;
     92     memset(c,0,sizeof(c));
     93     for(cnt=i=0;i<num;i++)
     94     {
     95         if(indegree[i]==false)
     96             flag=i;
     97         else
     98             cnt++;
     99     }
    100     if(cnt!=num-1)return false;
    101     if(!dfs(flag))return false;
    102     return true;
    103 }
    104 
    105 int main()
    106 {
    107     //freopen("in.txt","r",stdin);
    108     int n;
    109     string s1,s2;
    110     while(scanf("%d",&n),n)
    111     {
    112         num=0;
    113         id.clear();
    114         memset(indegree,0,sizeof(indegree));
    115         memset(G,0,sizeof(G));
    116         for(int i=0;i<n;i++)
    117         {
    118             cin>>s1>>s2;
    119             if(!id.count(s1))
    120                 id[s1]=num++;
    121             if(!id.count(s2))
    122                 id[s2]=num++;
    123                 if(!G[id[s1]][id[s2]])
    124                     indegree[id[s2]]=true;
    125             G[id[s1]][id[s2]]=1;
    126         }
    127         bool ans=toposort();
    128         if(ans)
    129             printf("Yes
    ");
    130         else
    131             printf("No
    ");
    132     }
    133     return 0;
    134 }
    135 */
  • 相关阅读:
    protobuf 协议 windows 下 C++ 环境搭建
    protobuf 协议 windows 下 java 环境搭建
    ProtocolBuffers (二) android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
    C++ ofstream和ifstream详细用法
    C# 关于out和ref的问题
    java 解析office文件 大全
    Ezhuang
    IOS
    Android Client and PHP Server
    一个IM开源项目LiteTalk
  • 原文地址:https://www.cnblogs.com/homura/p/4728276.html
Copyright © 2011-2022 走看看