有一群人,打桌球比賽,兩兩捉對撕殺,每兩個人之間最多打一場比賽。
球賽的規則如下:
如果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
3alice bob
smith john
alice smith
5a c
c dd e
b ea d
0sample output
yesno
思路:
1.首先這個題可以用map來解決,用兩個map,假如乙個為m1乙個為m2,那麼m1中就只放贏家,m2中放贏家和輸家,
如果m1.size()-m2.size()==1那麼就有乙個從來沒輸過,有解,否為沒有冠軍。
2.明顯這是乙個圖,需要找到入度為0點的,用拓撲排序判斷即可,那麼關鍵就是如何用字串構圖,用map構圖,這樣給每乙個字串設定了唯一識別符號,具體看**
#include #include #include #include #include #include using namespace std;
#define maxn 1010
int edge[maxn][maxn];//其實沒有用到
int ind[maxn];
bool solve(int t)
int main()
t--;
if(solve(t)) puts("yes");
else puts("no");
}return 0;
}
產生冠軍((hdu2094))((拓撲排序))
小結。1,利用拓撲排序當確定比賽的名次時用toposort 用ans 記錄入讀為零的點最後再依次輸出即可 這種情況預設不是環形才可 注意對入度隨時的處理 如hdu1285 2,當利用產生冠軍時 記錄 入度,最後看入度為零的點有幾個如果有多個則沒冠軍,否則反之 3,當確定是否能判定名次時 既沒環 用t...
產生冠軍 hdu2094拓撲排序
題意 給你一些比賽情況,看能否產生冠軍 思路 拓撲排序,給每個字串編乙個號,然後就是建圖,只要找到入度為0的點並且只有乙個那就能產生冠軍,否則不行 include include include include includeusing namespace std char str 2005 100...
HDU2094 產生冠軍 拓撲排序
題目大意 輸入一些選手之間的比賽結果,問你是否能確定出冠軍。很明顯,冠軍只有乙個,我們可以對於每一組輸入結果,把它存入乙個圖的鄰接矩陣中,然後遍歷入度為0的頂點即可,如果入度為0的頂點只有乙個,那麼很顯然,該頂點對應的選手就是冠軍,如果入度為0的頂點有多個,那麼就表明這些人直接沒有 比出勝負,冠軍就...