模板 並查集

2022-05-18 01:22:09 字數 1966 閱讀 2196

並查集

並查集,在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往在空間上過大,計算機無法承受;即使在空間上勉強通過,執行的時間複雜度也極高,根本就不可能在比賽規定的執行時間(1~3秒)內計算出試題需要的結果,只能用並查集來描述。——以上摘自360百科。

並查集並查集,字面意思來看完成的也主要就是三個操作:合併,查詢,集合。

其主要操作,就是為了判斷某兩個元素是否在同乙個集合裡面,而乙個乙個的尋找列舉由太過複雜,於是便有了並查集這個方便的思想:尋找祖宗。若兩個元素的祖宗節點是相同的,那麼這兩個元素也必定屬於同乙個集合。

首先來看乙個例題:

若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。

規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。

輸入格式:

第一行:三個整數n,m,p,(n<=5000,m<=5000,p<=5000),分別表示有n個人,m個親戚關係,詢問p對親戚關係。

以下m行:每行兩個數mi,mj,1<=mi,mj<=n,表示mi和mj具有親戚關係。

接下來p行:每行兩個數pi,pj,詢問pi和pj是否具有親戚關係。

輸出格式:

p行,每行乙個』yes』或』no』。表示第i個詢問的答案為「具有」或「不具有」親戚關係。

begin::那麼這個顯然這就是乙個十分經典的並查集模板題了。

若是不用並查集,而是按照傳統的思路來看,首先必須要儲存m條邊,然後再次進行普通的遍歷手法,時間複雜度大約在o(n^2)左右,效率很低。

由此想到了運用並查集:

首先便是對於並查集的第一項工作:怎麼實現連通塊??

將每個人抽象成為乙個點,編號分別為1,2,3,.....n,運用集合的思路,對於每個人建立乙個集合,此時每乙個集合裡都是只有這個人本身,也可以理解為:自己就是自己的祖宗。

之後每次初選乙個親戚關係時,就將他們合併起來,如果之後又詢問,就在當前結果中看兩個元素是否處於同乙個集合就可以了。

那麼接下來就是第二個問題:如何判斷兩個集合是否有親戚關係??

這就是之前所說的:找祖宗,然後看兩個集合的祖宗是不是相同就可以了。

下面附上**::

//

#include

#include#include

#include

#define maxn 1000001

using

namespace

std;

int f[maxn];//

指的是某一位的父親節點

int n,m;//

n:總人數 m:已知關係數量

int x,y;//

親戚雙方

int q;//

詢問次數

int i;//

用於迴圈

int find(int x)//

尋找x的祖宗 遞迴版 (普通版)

int find_2(int x)//

遞迴版 (普通版)

int find_imp(int x)//

尋找x的祖宗(路徑壓縮改進版) (遞迴版)

int find_imp_2(int x)//

尋找x的祖宗(路徑壓縮改進版) (非遞迴版)

void unionn(int r1,int r2)//

合併 r1,r2

int judge(int x,int y)//

判斷x y是否處於同一集合

intmain()

cin>>q;

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

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