hdu1811 並查集 拓撲排序

2021-07-15 20:10:53 字數 1512 閱讀 3270

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...