並查集模板

2021-07-27 03:14:00 字數 2903 閱讀 1837

2 /17

演算法筆記

並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。

其擁有如下特點:1,資料的聯通具有無向性,也就是說在合併子集和時,無向圖也只有一步

2:在最小生成樹中,可以根據並查集來判斷連通性而通過最小生成樹 頂點數等於邊數加一來判斷一棵樹是否為任意兩個頂點有且僅有一條路徑可以相通(另一種意義上的)最小生成樹

模板1:

#include

#include

using namespace std;

int n,m,f[20345];

int getf(int t)//這裡是找爹的遞迴函式

}void amerge(int l,int r)//合併兩個子集的函式,遵從擒賊先擒王和靠左原則

return ;

}int main()

for(int i=1;i<=m;i++)

int sum=0;

for(int i=1;i<=n;i++)

}cout

memory limit: 65536kb

problem description

海上有n

(1<= n <=2000)

個島,編號從1到n,同一部落的島嶼之間有直接或間接的路相連,不同部落之間無路可通。現在給出m

(1<= m <= n*(n-1)/2)

條路。問這片海域上共有多少部落。

input

多組輸入。每組第一行輸入n,m。接下來m行每行,每行兩個整數u,v代表島u與v之間有一條路。

output

每組資料輸出乙個整數,代表部落數。

example input

3 1

1 23 2

1 21 3

example output

2

1

模板2:

注意:1.此題運用並查集便可以做,最重要的一點是要先求出點的個數(詳見程式),再依據:如果點的個數n等於邊的條數m加1,就可保證任意兩個點之間有且僅有一條路徑可以相通。

2.剛開始時沒想到如何求點的個數,這是乙個難點,還有我把if(k == m + 1) 寫成了if(k = m + 1) 除錯了很久,這個錯誤出現了很多回,所以這裡寫一下,避免重蹈覆轍。

3.再說一下吧:測點的數目不好弄,因為如果輸入的點沒有1,只有2,3,4,5,6,不用a陣列標記一下的話,在這裡for(i = 1; i <= max; i++)  } k就會被 多加了一次,就錯了,第一次做時,忽略了必須得滿足任意兩點只之間都得有通路,就是下文的c,不明白可以看看第三組測試資料。

正確**:

#include

#include

int bin[100002], a[1000002];//a陣列為標記陣列

int findx(int x)

void merge(int x,int y)

int main()

k = 0, c = 0;//k 表示總共輸入的點的個數,從0開始,

//c變數是為判斷此圖兩個點是否最起碼有一條路徑可以相通

for(i = 1; i <= max; i++)

if(c==1 && k == m + 1)//如果c等於1,則說明途中路全通,當路不全通時,c會大於1.

//當然c=1;只是其中乙個條件,因為當圖中點與點之間都聯通時,

//假設其中有兩個點之間有2條路可通,此時的c也等於1,但不滿

//足"任意兩個點有且僅有一條路徑可以相通"這一條件,所以還需

//加上 k == m + 1 這一條件,(字母含義詳見**)

printf("yes\n");

else

printf("no\n");

}return 0;

}以下為題目中測試資料:

52 5

2 31 3

3 64 6

bin[1] = 3

bin[2] = 5

bin[3] = 6

bin[4] = 6

bin[5] = 3

bin[6] = 6

yes  此時只有bin[6] = 6, 所以此時c為1, 而又滿足 k = m + 1, 所以yes

41 2

3 43 5

4 5bin[1] = 2

bin[2] = 2

bin[3] = 4

bin[4] = 5

bin[5] = 5

no  此時c為2, 因為bin[2] = 2和bin[5] = 5, 而k為5,m為4,滿足k = m + 1;

例題:time limit: 1000ms

memory limit: 65536kb

problem description

從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的想法。比如下面的例子,第乙個是符合條件的,但是,第二個不符合,因為從5到4有兩條路徑(5-3-4和5-6-4)。

input

多組輸入,每組第一行包含乙個整數m(m < 100000),接下來m行,每行兩個整數,表示了一條通道連線的兩個房間的編號。房間的編號至少為1,且不超過100000。

output

每組資料輸出一行,如果該城堡符合小鑫的想法,那麼輸出"yes",否則輸出"no"。

example input

5

2 52 3

1 33 6

4 66

1 21 3

3 43 5

5 66 4

example output

yes

no

並查集模板

來自lifeng wang http hi.baidu.com fandywang jlu 前輩06年寫的東西,追隨前人足跡繼續努力。並查集的一些題目和相關解題報告 poj 1611 the suspects 最基礎的並查集 poj 2524 ubiquitous religions 最基本的並查集...

並查集模板

普通並查集 define max size 100005 int pa max size 儲存有向圖的邊 void init 初始化 該函式可以根據具體情況儲存和初始化需要的內容 int findset int a 不帶路勁壓縮 return a void union nodes int a,int...

並查集模板

codevs 2597 團夥 題目描述 description 1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資...