求連通塊(並查集實現)

2021-08-28 18:28:33 字數 805 閱讀 7336

連通塊可以理解為無向圖中有幾個連通的點集,那麼這個過程與並查集的原理就極其相似了,將點集看作並查集的祖先和他的後代們,相互連通的點就放在同一祖先下,這樣只需要查詢共有幾個祖先即可。

下面來一道例題深入理解下:[jsoi2008]星球大戰

當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它相連的點如果在圖中但是與它不在乙個連通塊中,那麼就將其合併,連通塊個數減一。 

ac**如下:

#include#include#includeusing namespace std;

const int max_n = 400005;

const int max_m = 200005;

vector vec[max_n];

int f[max_n],flag[max_n], num[max_n],ans[max_n];

int tot = 0;

int find(int x)

void connect(int x)

} }flag[x] = 1;

}int main()

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

cin >> k;

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

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

ans[k+1] = tot;

for(int i = k; i >= 1; i--)

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

return 0;

}

並查集專題 好朋友 (求連通塊個數)

5 63求解無向圖的連通塊數目。並查集模板題。最後統計合併後,有多少個不同的集合就可以。include include include using namespace std const int nmax 110 int father nmax 存放父親節點 bool isroot nmax 記錄某...

連通塊中點的數量(並查集)

題目 連通塊中點的數量 給定乙個包含n個點 編號為1 n 的無向圖,初始時圖中沒有邊。現在要進行m個操作,操作共有三種 c a b 在點a和點b之間連一條邊,a和b可能相等 q1 a b 詢問點a和點b是否在同乙個連通塊中,a和b可能相等 q2 a 詢問點a所在連通塊中點的數量 輸入格式 第一行輸入...

BZOJ 1015 並查集 連通塊

很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的 機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直 接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫 地摧毀反抗軍...