hdu 2094 產生冠軍(拓撲排序+map)

這裏寫圖片描述

這題有好幾種解法。。真的不用去想怎麼判斷拓撲排序成環的情況~~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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章