n,m**n個點,m條邊
隨之而來m條邊
q 代表q個操作
q行,每行乙個序號,代表將第m個輸入的邊刪除,問刪除後有多少個連通塊。
思路:我們將m條邊,和q詢問記錄下來,並將要刪除的邊標記。
然後對那些不用的邊使用並查集,並算出有多少個連通塊。
然後從最後乙個詢問開始,依次將那些邊加入並查集,如果加入時,兩個點的父親不同,那麼連通塊就減少乙個
1 #include 2 #includeview code3 #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 }
解決動態連通性 並查集
先貼乙個大佬的文章,解釋有趣簡單,非常適合新人 大佬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 個城市,其中一些彼此相連,另一些沒有...