HDU 2094 產生冠軍(STL map)

產生冠軍

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 26204    Accepted Submission(s): 11751
c++

 

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

問題分析

 用map就很好解決 記錄下參賽的總人數 再記錄下能被戰勝的總人數 若是兩者之差爲1 表明只有一我的不能被戰勝 那就是Yes 不然是No

代碼實現

 

#include<bits/stdc++.h>

using namespace std;

map<string,int>m1,m2;
int n,sum,loser;
string str1,str2;
int main()
{
    while(scanf("%d",&n)&&n!=0)
    {
        sum=0;
        loser=0;
        m1.clear();
        m2.clear();
        while(n--)
        {
            cin>>str1>>str2;
            if(m1[str1]==0)
            {
                m1[str1]=1;
                sum++;
            }
            if(m1[str2]==0)
            {
                m1[str2]=1;
                sum++;
            }
            if(m2[str2]==0)
            {
                m2[str2]=1;
                loser++;
            }
        }
        if(sum-loser==1)
        cout<<"Yes"<<endl;
        else
        cout<<"No"<<endl;
    }
}
相關文章
相關標籤/搜索