綜合題 hdu1811 並查集 鄰接表 拓撲排序

2021-06-29 08:22:18 字數 2095 閱讀 1812

最近在做並查集的訓練,偶遇一道不錯的題目,被卡住了兩天,今天終於過了,記錄一下。

題目:problem 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

對於每組測試,在一行裡按題目要求輸出

sample input

3 3

0 > 1

1 < 2

0 > 2

4 41 = 2

1 > 3

2 > 0

0 > 1

3 31 > 0

1 > 2

2 < 1

sample output

ok

conflict

uncertain

這道題的思路是把相等的點通過並查集的形式歸併起來,看成乙個點,把大量點之間的關係轉換成幾個集合間的關係,集合用根節點代替。建立好關係圖後,再通過拓撲排序來

確認結果,如果同時出現幾個入度為零的點,那麼就是關係不確定(因為歸併後,集合與集合間不可能相等),再進一步排序下去,如果發現沒排完,卻排不下去,說明存在

環,那麼就是說存在矛盾關係,整個過程應注意一點,合併集合,建立圖,拓撲排序,這是必須保證的順序,不能一邊建立圖,一遍合併集合(我一開始就是這樣掛的)。

上**:

//資料量大,記錄關係不能用二維陣列,要用鄰接表

#includeint fa[10005],rank[10005],n,m,head[10005],inde[10005],queue[10005],top;

bool flag,flag1;

/**************************************/

struct edge

e[20005];

void addedge(int a,int b)

/**************************************/

/*上面是鄰接表實現部分

*//**************************************/

struct relation

r[20005];

/**************************************/

/*該結構體用來儲存輸入的關係式

*/void init()

else

return ;

}void union()//用來把相同的點湊成乙個集合,用根結點代替集合內其他節點去比較

}/*****************************************/

/*通過不等式建立鄰接表(大的為頭節點建立鄰接表),上面方法是用來獲取鄰接表

*/void getans()//拓撲排序

{ int c=0,cc=0;

for(int i=0;i

hdu1811 並查集 拓撲排序

description 自從lele開發了rating系統,他的tetris事業更是如虎添翼,不久他遍把這個遊戲推向了全球。為了更好的符合那些愛好者的喜好,lele又想了乙個新點子 他將製作乙個全球tetris高手排行榜,定時更新,名堂要比富比士富豪榜還響。關於如何排名,這個不用說都知道是根據rat...

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 因為有些數字沒有邊...