清明 並查集

2021-07-26 08:14:24 字數 831 閱讀 2355

樹形資料結構。

顧名思義用作合併查詢。

最初可想象為多個集合a,b,c,d等

並即合併,c = a u b;

查即查詢,比如查詢a中所有元素

然而都是集合這樣太麻煩了

所以變成了樹形

彼此關係由指向決定,即父親兒子的關係

建樹 即確定集合元素,每個集合有乙個代表元素

依照關係,決定誰是誰的父親

代表元素為祖先

查詢 判斷兩個元素是否屬於同一集合

即查詢代表元素是否相同

可查詢兩個元素是否有同一祖先

合併 按秩合併,將兩個元素合併到同一集合

即兩個集合相加 其中一棵子樹成為另一棵子樹的子樹

是針對根節點的

應用:求無向圖的連通分量個數,最近公共祖先(lca),帶限制的作業排序,實現kruskar演算法求最小生成樹,關係查詢等

p.s 用並查集儲存兩點不在乙個集合時,可以通過儲存某個點的「敵人」集合來代表和他不在乙個監獄的罪犯,間接地實現維護某兩點不在乙個集合的情況;

還可以使用對立點的方式,即給每乙個實點都建立乙個與之對立的虛點。當讀取到a與b不在同一集合的資訊時,將a與b』,b與a』分別連邊,這樣也可以表示a與b不在同一集合

**實現初步

int fa[maxn];//x的父親是fa[x]

int deep[maxn];//秩,深度

void init()

int find(int x)

void merge(int x,int y)

bool same(int x,int y)

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...