並查集,動態連通性

2022-08-24 21:09:09 字數 1358 閱讀 9154

n,m**n個點,m條邊

隨之而來m條邊

q 代表q個操作

q行,每行乙個序號,代表將第m個輸入的邊刪除,問刪除後有多少個連通塊。

思路:我們將m條邊,和q詢問記錄下來,並將要刪除的邊標記。

然後對那些不用的邊使用並查集,並算出有多少個連通塊。

然後從最後乙個詢問開始,依次將那些邊加入並查集,如果加入時,兩個點的父親不同,那麼連通塊就減少乙個

1 #include 2 #include  

3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include

11 #include

12 #include 13

using

namespace

std;

14#pragma warning(disable:4996)

15 typedef long

long

ll;16

const

int inf = 1

<< 30;17

const

int n = 100000 + 10;18

intu[n], v[n], q[n];

19int

father[n];

20int

ans[n];

21bool

vis[n];

22void init(int

n)23

28int find(int

x)29

34int

main()

3544 scanf("

%d", &q);

45for (i = 0; i < q; ++i)

4650

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

5159}60

int tmp = 0;61

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

62if (father[i] == i)//

算出連通塊

63 tmp++;

64for (i = q - 1; i >= 0; --i)//

從後往前,加入那些要刪除的邊

657475}

76for (i = 0; i < q; ++i)

77 i == q - 1 ? printf("

%d\n

", ans[i]) : printf("

%d "

, ans[i]);78}

79 }

view code

解決動態連通性 並查集

先貼乙個大佬的文章,解釋有趣簡單,非常適合新人 大佬tql 不過這個原帖的閱讀量還沒有幾個 的高 唉 什麼是並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。常常在使用中以森林來表示。在實際解決問題的過程中並查集的應用廣泛,但主要還是用來判斷兩點是否聯通,以及尋找乙個節點的...

動態連通性

問題 一對整數p,q可以理解為 p與q是相連的 問給出一組整數對p,q,判斷p,q是否相連,如果相連,則忽略,不想連則新增連線。如 a b c d 則此時認為abcd互相連線。如果新增另一組整數對a,c 則新增不成功,因為此時a,c已經連通 若新增另一組整數對a,f。則新增成功,此時a,b,c,d,...

並查集 解決連通性問題

給的輸入形式不同,但都是利用並查集,並查集的實現是不變的。1 323.無向圖中連通分量的數目 給定編號從 0 到 n 1 的 n 個節點和乙個無向邊列表 每條邊都是一對節點 請編寫乙個函式來計算無向圖中連通分量的數目。2 547.省份數量 連通分量的數目 有 n 個城市,其中一些彼此相連,另一些沒有...