zoukankan      html  css  js  c++  java
  • 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一定能打败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
     
    今天刚刚学习拓扑排序  最主要的就是入度为零的点的寻找 尤其是这个题目 输入存储 是一个难点  我这种一直使用map  其实也算是一种方法
    只有一个入度为零的点 就可以产生冠军!!!!
    重新开始写博客吧!!
     
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 map<string,int>in;
     4 map<string,map<string,int> >mp;
     5 map<int,string>dis;
     6 map<string,int>pis;
     7 queue<string> q;
     8 int main()
     9 {
    10     int n;
    11     int coun;
    12     while(scanf("%d",&n)!=EOF)
    13     {
    14         if(n==0)
    15             break;
    16         in.clear();mp.clear();
    17         dis.clear();pis.clear();
    18         coun=1;
    19         string str1,str2;
    20         for(int i=1; i<=n; i++)
    21         {
    22             cin>>str1>>str2;
    23             if(pis[str1]==0)
    24             {
    25                 pis[str1]=1;
    26                 dis[coun++]=str1;
    27             }
    28             if(pis[str2]==0)
    29             {
    30                 pis[str2]=1;
    31                 dis[coun++]=str2;
    32             }
    33             if(mp[str1][str2]==0)
    34             {
    35                 mp[str1][str2]=1;
    36                 in[str2]++;
    37             }
    38         }
    39         int flag=0;
    40         for(int i=1;i<coun;i++)
    41         {
    42             if(in[dis[i]]==0)
    43             {
    44                 flag++;
    45                 q.push(dis[i]);
    46             }
    47         }
    48         if(flag==1)
    49             printf("Yes
    ");
    50         else
    51             printf("No
    ");
    52 }
    53 return 0;
    54 }
  • 相关阅读:
    Timer 实现2秒4秒连环炸
    Java中的注解
    PHP连接打印机
    php同步mysql两个数据库中表的数据
    thinkphp 两表、三表联合查询
    ereg/eregi报错处理办法
    ThinkPHP3.2判断手机端访问并设置默认访问模块的方法
    使用PHP获取时间今天 明天 昨天 时间戳的详解
    jquery获取radio和select选中值
    php开启mysqli扩展之后如何连接数据库
  • 原文地址:https://www.cnblogs.com/hsd-/p/4899447.html
Copyright © 2011-2022 走看看