1. 程式人生 > >【圖】最小生成樹(最小成本):克魯斯卡爾(Kruskal)演算法

【圖】最小生成樹(最小成本):克魯斯卡爾(Kruskal)演算法

給出一個連通網:
這裡寫圖片描述

克魯斯卡爾(Kruskal)演算法

基本思想

假設 N=(V,{E}) 是連通網:

  1. 令最小生成樹的初始狀態為只有 n 個頂點並且沒有邊的非連通圖 T={V,{}} ,圖中每個頂點自成一個連通分量。
  2. E 中選擇代價最小的邊,若該邊的兩個頂點落在 T 中不同的連通分量上,則將此邊加入到 T 中,否則就捨去此邊而選擇下一條代價最小的邊。
  3. 以此類推,直至 T 中所有頂點都在同一連通分量上為止。

克魯斯卡爾演算法主要針對邊來展開,邊數少時效率會非常高,所以對稀疏圖有很大的優勢;
普里姆演算法對於稠密圖,即邊數非常多的情況會更好一些。

圖解

1、將連通網中的邊轉化為邊集陣列,並對它們按權值從小到大排序。
這裡寫圖片描述
2、去掉所有邊,得到 T={A,B,C,D,E,F,G,H,I,{}}
3、對邊集陣列做迴圈遍歷,開始時,i=0,找到第 1 條邊,兩頂點為 EH,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,B,C,D,E,F,G,H,I,{(E,H)}}
這裡寫圖片描述這裡寫圖片描述
4、i=1,找到第 2 條邊,兩頂點為 CI,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,B,C,D,E,F,G,H,I,{(E,H),(C,I)}}
5、i=2,找到第 3 條邊,兩頂點為 AB,分別屬於兩棵樹(兩個連通分量),所以新增進 T

={A,B,C,D,E,F,G,H,I,{(E,H),(C,I),(A,B)}}
這裡寫圖片描述這裡寫圖片描述
6、i=3,找到第 4 條邊,兩頂點為 AF,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,B,C,D,E,F,G,H,I,{(E,H),(C,I),(A,B),(A,F)}}
7、i=4,找到第 5 條邊,兩頂點為 BI,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,B,C,D,E,F,G,H,I,{(E,H),(C,I),(A,B),(A,F),(B,I)}}
這裡寫圖片描述這裡寫圖片描述
8、i=5,找到第 6 條邊,兩頂點為 DH,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,
B,C,D,E,F,G,H,I,{(E,H),(C,I),(A,B),(A,F),(B,I),
(D,H)}}

9、i=6,找到第 7 條邊,兩頂點為 BG,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,B,C,D,E,F,G,H,I,{(E,H),(C,I),(A,B),(A,F),(B,I),(D,H),(B,G)}}
這裡寫圖片描述這裡寫圖片描述
10、i=7,找到第 8 條邊,兩頂點為 GF,它們屬於同一棵樹,捨去。再找 i=8,兩頂點為 BC,它們屬於同一棵樹,捨去。再找 i=9,兩頂點為 GH,分別屬於兩棵樹(兩個連通分量),所以新增進 T={A,B,C,D,E,F,G,H,I,{(E,H),(C,I),(A,B),(A,F),

相關推薦

小生成樹成本Kruskal演算法

給出一個連通網: 克魯斯卡爾(Kruskal)演算法 基本思想 假設 N=(V,{E}) 是連通網: 令最小生成樹的初始狀態為只有 n 個頂點並且沒有邊的非連通圖 T={V,{}}

c/c++ 用kruskal算法構造小生成樹

方向 查看 維數 dbo 一個 code lse size 只需要 c/c++ 用克魯斯卡爾(kruskal)算法構造最小生成樹 最小生成樹(Minimum Cost Spanning Tree)的概念: 假設要在n個城市之間建立公路,則連通n個城市只需要n-1條線路。這時

JS實現小生成樹Kruskal演算法

  克魯斯卡爾演算法列印最小生成樹:   構造出所有邊的集合 edges,從小到大,依次選出篩選邊列印,遇到閉環(形成迴路)時跳過。 JS程式碼: 1 //定義鄰接矩陣 2 let Arr2 = [ 3 [0, 10, 65535, 65535, 65535,

Kruskal演算法小生成樹

                1、基本思想:設無向連通網為G=(V, E),令G的最小生成樹為T=(U, TE),其初態為U=V,TE={ },然後,按照邊的權值由小到大的順序,考察G的邊集E中的各條邊。若被考察的邊的兩個頂點屬於T的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到T中,同時把兩個連通分

小生成樹Kruskal演算法

附轉載連結:https://www.cnblogs.com/yoke/p/6697013.html學習最小生成樹演算法之前我們先來了解下 下面這些概念:樹(Tree):如果一個無向連通圖中不存在迴路,則這種圖稱為樹。生成樹 (Spanning Tree):無向連通圖G的一個子

小生成樹——Kruscal算法

else 一個 oot n) struct kruscal stream .html d+ 一、核心思想 ? 將輸入的數據由小到大進行排序,再使用並查集算法(傳送門)將每個點連接起來,同時求和。 ? 個人認為這個算法比較偏向暴力,有些題可能會超時。 二、例題 洛谷—P336

NOI2018歸程重構樹

復雜度 修改 復雜 print noi truct dfs second getch 【NOI2018】歸程(克魯斯卡爾重構樹) 題面 洛谷 題解 我在現場竟然沒有把這道傻逼題給切掉,身敗名裂。 因為這題就是克魯斯卡爾重構樹的模板題啊 我就直接簡單的說一下把 首先發現答案就

短路徑演算法演算法和迪傑特拉演算法天勤資料結構高分筆記

迪傑斯特拉演算法演算法思想:     設有兩個頂點集合S和T,集合S存放途中已經找到最短路徑的頂點,集合T存放的是途中剩餘頂點。初始狀態是,集合S只包含源點V0,然後不斷從集合T中     選取到頂點V0的路徑長度最短的頂點Vu併入到初始集合中。集合S每併入一個新的頂點Vu,

luogu P3366 模板小生成樹演算法)

題目描述 如題,給出一個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,表示該圖共有N個結點和M條無向邊。(N<=5000,M<=200000) 接下來M行每行包含三個整數Xi、Yi、Zi,表示有一條長度為Zi的無向邊連線結點Xi

小生成樹Prim 普里姆演算法Kruskal 演算法生成 小生成樹

1.Analyse 來自兩位科學家。 生成最小生成樹,從0頂點出發,最小生成樹包含所以頂點>_<,這個作業難道好像就是似乎改個矩陣? 最好還是把最小生成樹變成一條路線,這樣就不用去,自己找路線了。 題目圖如圖 2.源自老師的Code Print 1Prim

小生成樹算法算法和普裏姆算法

algo 貪心 size cin out visit cast 聯通 兩個 一般最小生成樹算法分成兩種算法: 一個是克魯斯卡爾算法:這個算法的思想是利用貪心的思想,對每條邊的權值先排個序,然後每次選取當前最小的邊,判斷一下這條邊的點是否已經被選過了,也就是已經在樹內了,一般

小生成樹普利姆演算法演算法

設G = (V,E)是無向連通帶權圖,即一個網路。E中的每一條邊(v,w)的權為c[v][w]。如果G的子圖G’是一棵包含G的所有頂點的樹,則稱G’為G的生成樹。生成樹上各邊權的總和稱為生成樹的耗費。在G的所有生成樹中,耗費最小的生成樹稱為G的最小生成樹。構造最小生成樹的兩種方

->連通性->小生成樹(演算法) 小生成樹(普里姆演算法)

文字描述   上一篇部落格介紹了最小生成樹(普里姆演算法),知道了普里姆演算法求最小生成樹的時間複雜度為n^2, 就是說複雜度與頂點數無關,而與弧的數量沒有關係;   而用克魯斯卡爾(Kruskal)演算法求最小生成樹則恰恰相反。它的時間複雜度為eloge (e為網中邊的數目),因此它相對於普里姆演算法而

小生成樹kruskal演算法C++實現

參考部落格:https://blog.csdn.net/YF_Li123/article/details/75195549   最小生成樹之kruskal(克魯斯卡爾)演算法 kruskal演算法:同樣解決最小生成樹的問題,和prim演算法不同,kruskal演算法採用了邊貪心

小生成樹------演算法並查集、sort

1.並查集 用法:一個方便歸類的演算法。。。 將一個複雜的圖轉換成一個公共父節點的圖(如圖所示) 具體程式碼: ​ int find(int x) //並查集 { int r=x,i=x,temp; if (tree[r]==r) return

演算法(Kruskal)小生成樹

演算法競賽中常用的演算法,求圖的最小生成樹 過程: 對邊集排序, 選取最小邊,將連線的節點放到一個集合中 選取次小的邊,當邊連線的定點不在同一個集合中時,合併集合。 #include<c

[Sicily 1090 Highways] 求小生成樹的兩種演算法普里姆演算法/演算法

(1)問題描述: 政府建公路把所有城市聯絡起來,使得公路最長的邊最短,輸出這個最長的邊。 (2)基本思路: 使得公路最長的邊最短其實就是要求最小生成樹。 (3)程式碼實現: 普里姆演算法: #

小生成樹---普里姆演算法Prim演算法)和演算法Kruskal演算法

      **最小生成樹的性質:MST性質(假設N=(V,{E})是一個連通網,U是頂點集V的一個非空子集,如果(u,v)是一條具有最小權值的邊,其中u屬於U,v屬於V-U,則必定存在一顆包含邊(u,v)的最小生成樹)** # 普里姆演算法(Pri

圖解小生成樹 - (Kruskal)算法

lin p s nbsp 時間 top table idt max 回路 我們在前面講過的《克裏姆算法》是以某個頂點為起點,逐步找各頂點上最小權值的邊來構建最小生成樹的。同樣的思路,我們也可以直接就以邊為目標去構建,因為權值為邊上,直接找最小權值的邊來構建生成樹也是很自然的

小生成樹

角度 ems 不理解 += 重復 highlight 賦值 truct bool 處理何種問題:求解最小生成樹,適合點多邊少的無向圖。(以證明,放心用) 性能:時間復雜度為O(e*loge),e為邊的個數。 原理:貪心策略 實現步驟: <1>設一個有