這題有好幾種解法。。真的不用去想怎麼判斷拓撲排序成環的情況~~QAQ 第一種,把勝利的放在一組,把輸的放在一組,然後驗證兩個組之間有無重複。。 。第二種,就是判斷多少個點無前驅,只有一個點的情況可以產生冠軍,其他輸出No。。(當然這裏肯定要用到點map~不然就難辦了
第二種代碼:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
int mp[2010][2010], seg[2010];//開到2000是因爲有1000個對手,怕給了2000個不同的人。。。
void topsort(int n){
int flag = 0;
for(int j = 1; j < n;j++){//n取不滿,因爲i自加
if(seg[j] == 0){
flag++;
}
}
if(flag == 1) cout << "Yes"<<endl;
else cout << "No"<<endl;
}
int main(){
int t;
while(scanf("%d",&t),t){
map<string , int>m;
memset(mp, 0, sizeof(mp));
memset(seg, 0, sizeof(seg));
int i = 1;
while(t--){
string u ,v;
cin >> u >> v;
if(!m.count(u)) m[u] = i++;
if(!m.count(v)) m[v] = i++;
if(!mp[m[u]][m[v]]){
mp[m[u]][m[v]] = 1;
seg[m[v]]++;
}
}
topsort(i);
}
return 0;
}