並查集 最小生成樹專題

2021-10-08 13:17:00 字數 1337 閱讀 7350

並查集:樸素並查集和帶權並查集

並查集介紹

難點:路徑壓縮和啟發式合併的理解

常用模板:

(

1)樸素並查集:

int p[n]

;//儲存每個點的祖宗節點

// 返回x的祖宗節點

intfind

(int x)

// 初始化,假定節點編號是1~n

for(

int i =

1; i <= n; i ++

) p[i]

= i;

// 合併a和b所在的兩個集合:

p[find

(a)]

=find

(b);(2

)維護size的並查集:

int p[n]

, size[n]

;//p儲存每個點的祖宗節點, size只有祖宗節點的有意義,表示祖宗節點所在集合中的點的數量

// 返回x的祖宗節點

intfind

(int x)

// 初始化,假定節點編號是1~n

for(

int i =

1; i <= n; i ++

)// 合併a和b所在的兩個集合:

size[

find

(b)]

+= size[

find

(a)]

; p[

find

(a)]

=find

(b);(3

)維護到祖宗節點距離的並查集:

int p[n]

, d[n]

;//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離

// 返回x的祖宗節點

intfind

(int x)

return p[x];}

// 初始化,假定節點編號是1~n

for(

int i =

1; i <= n; i ++

)// 合併a和b所在的兩個集合:

p[find

(a)]

=find

(b);

d[find

(a)]

= distance;

// 根據具體問題,初始化find(a)的偏移量

次小生成樹

最小樹形圖

總結:次小生成樹和最小樹形圖可能對大家來說比較困難,其實這種就可以先記乙個模板和用法,以後有時間再研究。

其他的一些演算法就比較簡單,但是更多的時候和其他的一些演算法進行結合或者是一些思維題,這就需要對演算法的原理的一些理解和一些常用方法的鍛鍊了。

並查集(最小生成樹)

時間限制 1000 ms 記憶體限制 65536 kb 題目描述 有一張城市地圖,圖中的頂點為城市,無向邊代表兩個城市間的連通關係,邊上的權為在這兩個城市之間修建高速公路的造價,研究後發現,這個地圖有乙個特點,即任一對城市都是連通的。現在的問題是,要修建若干高速公路把所有城市聯絡起來,問如何設計可使...

最小生成樹 並查集練習

叢林中的路 熱帶島嶼lagrishan的首領現在面臨乙個問題 幾年前,一批外援資金被用於維護村落之間的道路,但日益繁茂的叢林無情的侵蝕著村民的道路,導致道路維修開銷巨大,長老會不得不放棄部分道路的維護。已經知道了每條路每個月的維修費用 單位為aacms 現在長老會需要提出一種方案,即需要保證村落之間...

並查集 最小生成樹(prim kruskal)

並查集,從名字上來看可以知道,是乙個集合,而且這個集合可以合併和查詢。查詢,主要是查詢集合中的某乙個元素的祖先是誰,某一些元素是不是擁有相同的祖先。合併,是把兩個不想交的集合合併為乙個集合。並查集的思想就是朋友的朋友就是朋友 雖然現實生活中並不是這樣 並查集的第一步初始化,自己是自己的祖先。乙個人來...