有一群人,打桌球比賽,兩兩捉對撕殺,每兩個人之間最多打一場比賽。
球賽的規則如下:
如果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
5a c
c dd e
b ea d
0
sample output
yes
no
剛開始想的有點複雜,假如幾個人之間的輸贏關係形成了環的話,那麼冠軍肯定不在這幾個人裡面,然後拓撲判環啥的。。。。
emmmm~
其實,只需要判斷一下,入度為0的(沒有輸給過任何人的)人,只有乙個,那他肯定就是冠軍了;
#include#include#include#include#includeusing namespace std;
map> g;
mapvis;
setname;
int n;
//void toposort()
// }
// break;
// }
// }
// }
//}//這些雖說都沒用到,但是以後針對這種結構的拓撲,可以考慮這種。
void sovle()
} if(count==1)
} //toposort();
sovle();
} 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的頂點有多個,那麼就表明這些人直接沒有 比出勝負,冠軍就...