並查集求聯通塊個數 洛谷P1197

2021-08-31 21:35:38 字數 886 閱讀 5547

傳送門:

並查集求聯通塊個數。

這個題是每摧毀乙個點求一次聯通塊的個數,並查集不容易維護這種摧毀更新的,相反的,並查集可以很好的維護每安裝乙個點更新一次這種問題。摧毀和安裝是對立的,既然按順序摧毀,我們就逆序安裝。

首先要算出沒安裝前(也就是摧毀之後)的聯通塊的個數。怎麼求呢,我們在記錄圖的邊的時候記錄一下起點和終點,然後我們for一遍邊集,如果起點和終點都沒有被摧毀,我們就將他們放進並查集。

然後首先計算一下最終答案。並查集每乙個find(i)==i都是乙個聯通塊。

然後我們開始安裝點。

每安裝乙個點,先將tot++,然後遍歷它的邊,如果它的相鄰點沒有被摧毀(或者建好了),也就是相鄰點還在,並且他們不是乙個集合,我們就讓tot--,並且將該點放進並查集。(為什麼要tot--,大家自己動手畫個簡單的圖就能明白了。)

大致思路就是這樣啦!

下面是大家喜聞樂見的**(話說我覺得自己的碼風還不錯哎)

#include using namespace std;

typedef pairp;

const int maxn = 5e5+7;

int p[maxn],r[maxn];

int b[maxn];

int cur[maxn];

int ans[maxn];

vectorg[maxn];

vector>e;

void init()

int k;

cin>>k;

for(int i=0;i>b[i];

cur[b[i]] = 1;

} for(int i=0;i=0;i--)}}

} }cout

}

任意點 並查集求聯通塊

任意點時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數...

洛谷p1525 並查集

先將最大的犯罪都找出來然後將人員分組 假設兩人x,y 如果x 前面已經有過敵人了 那就將y合併到x的敵人裡去 y也是如此若有 將x合併到y的敵人去 如果x 和 y前面都沒有 那麼互相將彼此設為敵人 直到找到矛盾的 就是 xy有同乙個敵人 include include include using n...

並查集 洛谷 P1551 親戚

若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。輸入格式 第一行 三個整數n,m,p,n 5000,m ...