zcmu 1435 盟國(並查集增刪裸題)

2021-08-28 17:29:56 字數 1204 閱讀 4144

【題目】

1435: 盟國

【題意】

給定一組操作進行結盟和退盟,最後輸出最終有多少個聯盟。

【思路】

並查集的增刪。

增。想必大家都會了不必多言。刪,之前沒接觸過,現在來學習總結一下。

對於刪除操作,在所有節點都直接連線在根節點上的並查集中,理論上只要把要刪除的節點的上級重新指向自己就可以了。但是在實際情況中,我們的並查集形成的樹的形態都是不可預估形態的,如果直接將乙個節點指向自己可能會將他的下級和他一塊刪除,這就和題意相違背了= =。所以需要進行刪除操作的就要處理一下:

定義乙個陣列f存放虛根,f[i]存放的是元素 i 的編號,這個編號在程式執行過程中是逐漸變化的。

當刪除了 元素 i 以後,將元素 i 的編號更改為當前最大的編號+1(pos),再把pre[i]賦值為新的f[i]。

這樣可以使得元素 i 原先的同組元素不受影響,且元素 i 被分配到乙個只包含元素 i 的新組。

【**】

#include #include #include #include #include #include #include #include #include #include #include #include #define mem(a) memset(a,0,sizeof(a))

#define go(i,a,b) for(int i=a;i<=b;i++)

#define og(i,a,b) for(int i=a;i>=b;i--)

using namespace std;

const int maxn=1000005;

const int inf=0x3f3f3f3f;

typedef long long ll;

typedef unsigned long long ull;

int pre[maxn],f[maxn],vis[maxn];

int n,pos;

void init()

int find(int x)

void join(int x,int y)

void del(int n)

main()

int ans=0; mem(vis);

go(i,0,n-1)

printf("case #%d: %d\n",++t,ans);}}

fzu 2155 盟國 並查集的增刪

description 世界上存在著n個國家,簡單起見,編號從0 n 1,假如a國和b國是盟國,b國和c國是盟國,那麼a國和c國也是盟國。另外每個國家都有權宣布退盟 注意,退盟後還可以再結盟 定義下面兩個操作 m x y x國和y國結盟 s x x國宣布退盟 input 多組case。每組case輸...

Fzu 2155 盟國 並查集的增刪 裸題

problem 2155 盟國 世界上存在著n個國家,簡單起見,編號從0 n 1,假如a國和b國是盟國,b國和c國是盟國,那麼a國和c國也是盟國。另外每個國家都有權宣布退盟 注意,退盟後還可以再結盟 定義下面兩個操作 m x y x國和y國結盟 s x x國宣布退盟 多組case。每組case輸入乙...

帶刪除並查集 FZU 2155 盟國

今天在安靜的草坪上寫這些東西,相對於其他地方,心理能夠寧靜下來許多,就是稍微有點冷了。帶刪除的並查集。方法是將初始化father i i的,用陣列代替,這樣可以回溯到刪除時的初始狀態了。時間卡的略微拙計。include include include include include using na...