第一次寫部落格,同時也是第一次知道並查集可以這麼玩的,基本上全全看別人的了==,**也差不多,不好意思了,什麼時候才能有這種思想。
簡而言之就是有了乙個real陣列 表示最終的 國家的位置 從real[a]=all++;可以看出,相應的 改變有 join(real[a],real[b]); u=find1(real[i]); 無形之中將乙個 變化過的國家的之前的狀態刪去了,挺好的 當然啦 要注意多了乙個 real[i]=i.
相當於原來的狀態雖然存在 但是已經沒了意義 可以做個參照 而要看的,是real裡的。
用乙個陣列標記真實的,原來的自己構成封閉迴圈的 但不受影響。
#include
#include
int father[500005];
int real[500005];
int vis[500005];
int n, m, all;
int find1(int r)
void join(int a,int b)
int main()
else
}int ans=0;
for(int i=0; iint u=find1(real[i]);
if(vis[u]==0)
}printf("case #%d: %d\n", t++, ans);
}return
0;}
帶刪除並查集 FZU 2155 盟國
今天在安靜的草坪上寫這些東西,相對於其他地方,心理能夠寧靜下來許多,就是稍微有點冷了。帶刪除的並查集。方法是將初始化father i i的,用陣列代替,這樣可以回溯到刪除時的初始狀態了。時間卡的略微拙計。include include include include include using na...
fzu 2155 盟國 並查集的增刪
description 世界上存在著n個國家,簡單起見,編號從0 n 1,假如a國和b國是盟國,b國和c國是盟國,那麼a國和c國也是盟國。另外每個國家都有權宣布退盟 注意,退盟後還可以再結盟 定義下面兩個操作 m x y x國和y國結盟 s x x國宣布退盟 input 多組case。每組case輸...
FZU2155 盟國 (並查集的虛擬節點)
有關並查集中元素的刪除問題,刪除其中乙個元素的話雖其他元素之間的關係式沒有影響的,這點一定要注意,要解決這個問題,可以不動原來的節點,而建立乙個對映,是那些刪掉的幾點對映到乙個更大得數,用陣列來記錄,當他要再次合併時,只要查詢他的對映關係即可,最後統計一下。include includeint fa...