並查集 (模板)

2021-09-11 16:36:53 字數 909 閱讀 5200

附上知識部落格:並查集

4步走,初始化,查詢,合併,路徑壓縮

1)初始化

for(int i = 0; i < = n; i++)
2)查詢

//遞推式 

int findfather(int x)

return x;

}//遞迴式

int findfather(int x)

3)合併

void union(int a, int b)

}

並查集產生的每乙個集合都是一棵樹

4)壓縮路徑

上面的並查集沒有憂化。

極端情況下效率很低,現在題目給出的元素數量很多,並且形成了一條鏈,那麼這個查詢函式的效率會很低,假如說有10^5個元素,那麼我們找第乙個元素就需要10^5次查詢,而且每次查詢都需要查詢到最後乙個元素。每次都需要10^5,這種計算量太難受了,對了我們可以把當前查詢結點的路徑上的所有節點的父親都指向根節點

(1)按原先的方法獲得x的根節點r

(2)重新從x開始走一遍尋找根節點的過程,把路徑上的所有結點的父親全部改為根節點r。

查詢時間就會變成o(1)。有人會說,這樣改不消耗時間麼?,是的消耗,但是一勞永逸啊。會打表麼?

//遞推式 

int findfather(int x)

while( a != father[a] )

return x;

}//遞迴式

int findfather(int v)

}

並查集模板

來自lifeng wang http hi.baidu.com fandywang jlu 前輩06年寫的東西,追隨前人足跡繼續努力。並查集的一些題目和相關解題報告 poj 1611 the suspects 最基礎的並查集 poj 2524 ubiquitous religions 最基本的並查集...

並查集模板

普通並查集 define max size 100005 int pa max size 儲存有向圖的邊 void init 初始化 該函式可以根據具體情況儲存和初始化需要的內容 int findset int a 不帶路勁壓縮 return a void union nodes int a,int...

並查集模板

codevs 2597 團夥 題目描述 description 1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資...