最小生成樹 簡單入門

在這裏插入圖片描述

最小生成樹

建圖是圖論基礎
https://blog.csdn.net/nuoyanli/article/details/88842395

什麼是最小生成樹

最小生成樹:任何只由 G G 的邊構成,幷包含 G G 的所有頂點的樹稱爲 G G 的生成樹( G G 連通). 加權無向圖 G G 的生成樹的代價是該生成樹的所有邊的代碼(權)的和. 最小代價生成樹是其所有生成樹中代價最小的生成樹。

可以看啊哈算法理解 或者 參考這個博客

http://www.javashuo.com/article/p-fgvmztmv-ho.html

算法

  • 普利姆( P r i m Prim
    此算法可以稱爲「加點法」,每次迭代選擇代價最小的邊對應的點,加入到最小生成樹中。算法從某一個頂點 s s 開始,逐漸長大覆蓋整個連通網的所有頂點。
    圖的所有頂點集合爲 V V
    初始令集合 u = s , v = V u u={s},v=V−u ;
    在兩個集合 u , v u,v 能夠組成的邊中,選擇一條代價最小的邊 ( u 0 , v 0 ) (u_0,v_0) ,加入到最小生成樹中,並把 v 0 v_0 併入到集合 u u 中。
    重複上述步驟,直到最小生成樹有 n 1 n-1 條邊或者 n n 個頂點爲止。

  • 克魯斯卡爾( K r u s k a l Kruskal )

假設 W N = ( V , E ) WN=(V,{E}) 是一個含有 n n 個頂點的連通網,則按照克魯斯卡爾算法構造最小生成樹的過程爲:先構造一個只含n個頂點,而邊集爲空的子圖,若將該子圖中各個頂點看成是各棵樹上的根結點,則它是一個含有n棵樹的一個森(摘自 n o c o w nocow

K r u s k a l Kruskal 算法(克魯斯卡爾算法):(如果想要邊的總長度之和最短,我們自然可以想到首先先選最短的邊)將所有的邊排序,從最小的邊開始選,每次連通最小的邊,不能形成迴路,所以就要求判斷兩點間是否已經連通。爲了優化操作,我們這裏用並查集優化,判斷其是否在一個樹上。如果不在一個樹上,就加進去,繼續添加,直到所有的邊都在一個集合即可(連通)。
時間複雜度爲 O ( m l o g m ) O(mlogm)

這是我的簡單證明和模板

https://blog.csdn.net/nuoyanli/article/details/88662568