題目大意:有n個集合,提供三種操作
1 p q:將p所在的集合和q所在的集合並起來
2 p q:將p元素移到集合q所在的集合
3 p:求出p所在集合有多少個元素並輸出這些元素的和
sample input
5 71 1 2 //集合1與2合併(集合操作)
2 3 4 //元素3放到元素4所在的集合中
1 3 5 //將[3,4]與[5]合併,得到[3,4,5]
3 4 //查詢4所在的集合
2 4 1 //將元素4移動到1所在集合,得到[1,2,4]
3 43 3 //查詢3所在的集合[3,5]
sample output //每查詢一次,輸出一次
3 12 //4所在的集合有3個元素,和為12
3 7
2 8sol:開始時,n個點,n個集合,然後依次實現題目中的3種操作。在實現移動操作時,由於我們不知道該點在原集合中是整個集合的根還是葉子結點或其它中間結點,如果是葉子結點,操作簡單,但如果是非葉子結點,特別是根結點,該集合中的其它結點的操作都與之息息相關,就不好操作了。所以我們採取的方法是將原點留在那裡,只是消除它在原集合中根結點那的影響力,同時我們將該點的集合編號變更成其它的新編號,即開個虛點出來,該點單獨成集合,然後與目標集合進行合併操作就好了。
**實現:
1 #include 2 #include 3using
namespace
std;
4#define maxn 200018
5int
father[maxn],idx[maxn],num[maxn];
6long
long
intsum[maxn];
7int
n,m,cnt;
8int find(intx)9
13void
init()
1421 cnt=n;22}
23void union(int p,int
q)24
30void delete(int
p)31
41int
main()
4258
else
if(ope==2)59
66}67else
6874}75
}76return0;
77 }
並查集 並查集的刪除操作
描述 一天小 w 給學弟們上課,小 w 說 注意了,並查集只適合於加的操作,不太方便處理減的操作喲。j 老師聽了後,呵呵了一下。她課後找到小 w 說,其實並查集也可以做減的操作的。只看你如何靈活運用了。比如這個題 給你 n 個元素,最開始時分屬於 n 個集合,有如下三種操作 小 w 陷入了無盡的思考...
並查集的刪除操作
對於刪除操作,在完美的並查集中 所有節點都直接連線在根節點上 理論上只要把要刪除的節點的上級重新指向自己就可以了。但是實際情況中,我們的並查集形成的樹的形態都是不可預估形態的,如果直接將乙個節點指向自己可能會將他的 下級 和他一起刪除,這就和我們的想法違背了。所以在乙個需要刪除的並查集中初始化時就要...
可刪除並查集 myf並查集
繼月賽出了道可刪除並查集後,又做了幾道可刪除並查集的題,發現之前的 有點小問題。可刪除並查集的基本原理是設定乙個虛點,也就是說乙個點刪除了,那麼他對應的值就不再是之前的那乙個點,而是變成了其他點。即可刪除並查集通過id對映的關係查詢我的點在 有幾個問題就是初始化時必須要把 n m 個點的父親結點都設...