description
世界上存在著n個國家,簡單起見,編號從0~n-1,假如a國和b國是盟國,b國和c國是盟國,那麼a國和c國也是盟國。另外每個國家都有權宣布退盟(注意,退盟後還可以再結盟)。
定義下面兩個操作:
「m x y」 :x國和y國結盟
「s x」 :x國宣布退盟
input
多組case。
每組case輸入乙個n和m (1 ≤ n ≤ 100000 , 1 ≤ m ≤ 1000000),n是國家數,m是運算元。
接下來輸入m行操作
當n=0,m=0時,結束輸入
output
對每組case輸出最終有多少個聯盟,格式見樣例。
sample input
5 6m 0 1
m 1 2
m 1 3
s 1m 1 2
s 33 1
m 1 2
0 0
sample output
case #1: 3
case #2: 2
合併問題就不在說了,關鍵是刪除問題,為了避免影響到一整個集合,所以用乙個vis陣列標記每個點的真實位置,
目的是刪除乙個點後,將他的位置移到原總數組的末尾
#include#include#include#includeusing namespace std;
int f[2000010],vis[2000010];
int p[2000010];
int getf(int v)
void merge(int u,int v)
int main()
{ int n,m,a,b,k=1;
char c;
while(~scanf("%d%d",&n,&m))
{if(!n&&!m)
break;
int sum=n;
for(int i=0; i
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...
FZU2155 盟國 (並查集的虛擬節點)
有關並查集中元素的刪除問題,刪除其中乙個元素的話雖其他元素之間的關係式沒有影響的,這點一定要注意,要解決這個問題,可以不動原來的節點,而建立乙個對映,是那些刪掉的幾點對映到乙個更大得數,用陣列來記錄,當他要再次合併時,只要查詢他的對映關係即可,最後統計一下。include includeint fa...