【題目】
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...