並查集模板

2021-10-09 11:14:07 字數 1627 閱讀 7653

並查集的精髓在find尋祖宗函式

一共有n個數,編號是1~n,最開始每個數各自在乙個集合中。

要注意,這個find函式,必須要對某個節點進行一次查詢操作之後,才會將這條路上的所有結點的父親劃分到整個集合的根節點下, 所以,如果要利用父親結點陣列來判斷所有集合的個數的話,就需要在判斷之前,遍歷一次整個父親結點陣列,執行一次find函式,來消去所有的子樹,將所有結點都轉化為葉子節點。

例題:現在要進行m個操作,操作共有兩種:

「m a b」,將編號為a和b的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作;

「q a b」,詢問編號為a和b的兩個數是否在同乙個集合中;

輸入格式

第一行輸入整數n和m。

接下來m行,每行包含乙個操作指令,指令為「m a b」或「q a b」中的一種。

輸出格式

對於每個詢問指令」q a b」,都要輸出乙個結果,如果a和b在同一集合內,則輸出「yes」,否則輸出「no」。

每個結果佔一行。

#include

using

namespace std;

const

int n =

1e5+10;

int n,a,b,p[n]

,m;int

find

(int x)

intmain

(void

)while

(m --

)elseif(

*op ==

'q')

}return0;

}

變形例題(加上集合內元素個數的功能):

給定乙個包含n個點(編號為1~n)的無向圖,初始時圖中沒有邊。

現在要進行m個操作,操作共有三種:

「c a b」,在點a和點b之間連一條邊,a和b可能相等;

「q1 a b」,詢問點a和點b是否在同乙個連通塊中,a和b可能相等;

「q2 a」,詢問點a所在連通塊中點的數量;

輸入格式

第一行輸入整數n和m。

接下來m行,每行包含乙個操作指令,指令為「c a b」,「q1 a b」或「q2 a」中的一種。

輸出格式

對於每個詢問指令」q1 a b」,如果a和b在同乙個連通塊中,則輸出「yes」,否則輸出「no」。

對於每個詢問指令「q2 a」,輸出乙個整數表示點a所在連通塊中點的數量

每個結果佔一行。

// bing cha ji

#include

#include

using

namespace std;

const

int n =

1e5+10;

int p[n]

,n,m,size[n]

;int

find

(int x)

intmain

(void

)while

(m --)}

else

if(op ==

"q1"

)else

}else

if(op ==

"q2")}

return0;

}

並查集模板

來自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年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資...