並查集(判斷環路)

2021-08-27 20:26:52 字數 1311 閱讀 6936

並查集是非常常用的一種資料結構,用於把資料按照規則整理成集合,集合最終呈現為樹狀結構,以根節點作為不同集合的區分標誌,實現方面主要涉及查詢和合併,**如下

//查詢

int find(int x)

return r;

}//合併

void unionset(int x, int y)

**不難理解,其目的就是為了構建乙個森林將離散的資料變成集合,這裡我們學習如何用並查集判斷圖的環路,並查集判斷圖的方法是按邊合併集合,對於圖,我們可以做乙個鄰接矩陣或者直接按邊來遍歷合併集合(每個邊遍歷一次),當遍歷一條邊出現兩個頂點早就處於同乙個集合時即可判定有環路。

以51nod-1416為例:

福克斯在玩一款手機解迷遊戲,這個遊戲叫做」兩點」。基礎級別的時候是在乙個n×m單元上玩的。像這樣:

每乙個單元有包含乙個有色點。我們將用不同的大寫字母來表示不同的顏色。

這個遊戲的關鍵是要找出乙個包含同一顏色的環。看上圖中4個藍點,形成了乙個環。一般的,我們將乙個序列 d1,d2,...,d

k 看成乙個環,當且僅當它符合下列條件時:

1.    這k個點不一樣,即當 i≠j時, d

i 和 d

j不同。

2.    k至少是4。

3.    所有的點是同一種顏色。

4.    對於所有的 1≤i≤k-1: d

i 和 d

i+1 是相鄰的。還有 d

k 和 d1 也應該相鄰。單元 x 和單元 y 是相鄰的當且僅當他們有公共邊。

當給出一幅格點時,請確定裡面是否有環。

**:

#include using namespace std;

int pre[2505];

int find(int x)

return r;

}void unionset(int x, int y)

int main()

} int flag=0;

for(int i=0;i

else

flag=1;

}if(j

else

flag=1;

}if(flag==1) break;

}if(flag==1) break;

} if(flag==1)

cout<

else

cout<

return 0;

}

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集 判斷環,樹

hdu 1272 小希的迷宮 include include include include include include include include include include include include include define inf 0x3f3f3f3f using nam...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...