description
自從lele開發了rating系統,他的tetris事業更是如虎添翼,不久他遍把這個遊戲推向了全球。
為了更好的符合那些愛好者的喜好,lele又想了乙個新點子:他將製作乙個全球tetris高手排行榜,定時更新,名堂要比富比士富豪榜還響。關於如何排名,這個不用說都知道是根據rating從高到低來排,如果兩個人具有相同的rating,那就按這幾個人的rp從高到低來排。
終於,lele要開始行動了,對n個人進行排名。為了方便起見,每個人都已經被編號,分別從0到n-1,並且編號越大,rp就越高。
同時lele從狗仔隊裡取得一些(m個)關於rating的資訊。這些資訊可能有三種情況,分別是"a > b","a = b","a < b",分別表示a的rating高於b,等於b,小於b。
現在lele並不是讓你來幫他製作這個高手榜,他只是想知道,根據這些資訊是否能夠確定出這個高手榜,是的話就輸出"ok"。否則就請你判斷出錯的原因,到底是因為資訊不完全(輸出"uncertain"),還是因為這些資訊中包含衝突(輸出"conflict")。
注意,如果資訊中同時包含衝突且資訊不完全,就輸出"conflict"。
input
本題目包含多組測試,請處理到檔案結束。
每組測試第一行包含兩個整數n,m(0<=n<=10000,0<=m<=20000),分別表示要排名的人數以及得到的關係數。
接下來有m行,分別表示這些關係
output
對於每組測試,在一行裡按題目要求輸出
和上乙個拓撲排序幾乎完全相同,就是多了乙個等於,遇到等於進行縮點即可,一開始想使用最小樹形圖的縮點法發現十分麻煩,於是就決定先並查集縮點後再建圖。
注意不能邊縮邊建,因為並查集會退化,所以建出的圖很容易會指向已經被縮掉的點。
wa了五發 sigh。
#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int n=100010;
int ru[n],sum;
int f[n];
vectormp[n];
vectorans;
queueq;
int x[n],y[n],ch[n];
int found(int x)
int mix(int x,int y)
else return 0;
}int topo(int n)
//for(int i=0;i') mp[v].push_back(u),ru[u]++;
} int ans=topo(n);
if(ans==1)
printf("conflict\n");
if(ans==2)
printf("ok\n");
if(ans==3)
printf("uncertain\n");
}return 0;
}
hdu1811 並查集 拓撲排序
題目大意 有n個點 編號0 n 1 有m個關係,或者 若這n個點能形成固定的鏈式大小關係,就輸出 ok 如果關係有衝突,則輸出 conflict 如果關係不全,則輸出 uncertain ps 坑點,conflict 優先於 uncertain 所以判斷到 uncertain 條件時,別急著輸出 u...
HDU 1811 並查集 拓撲排序
題目鏈結 rank of tetris 我們先處理 的情況,把相等關係的兩個數字合併,最終只用他們的根來代表他們。然後再處理 的情況,我們需要先找到每個數字的根,再進行邊的連線。我們還需要記錄縮點後最終有幾個數字,以及進行topo的時候,放進佇列的條件是in 0 find i i 因為有些數字沒有邊...
hdu 1811 拓撲排序 並查集判斷
拓撲排序的兩個性質 如果一次入隊入度為零的點大於1則說明拓撲排序序列不唯一 如果排序的總個數小於給定的個數,則說明存在迴路 include include include include includeusing namespace std struct node q 30000 int indeg...