關於最小生成樹演算法 —— Kruskal 有效性的證明
證明過程:
- 首先,假設我們已經對所有邊進行了排序,並且當前遍歷到的邊是連線點1和點2的邊
- 因為這條邊是最小的邊,而點1和點2在最小生成樹中一定會直接或間接的相連,因此任何從點1到點2的路徑都不小於這條邊。如圖,如果不走這條邊就只能走1→3→2(而如果這樣走顯然會使得1→2的距離過大,而我們當前只討論1→2的最優選項)。或者,我們可以假設一種情況:點1和點2之間有兩條權值為0.5的邊,間接的連線了點1和點2,那麼這條路徑顯然比當前權值為2的邊的權值小。但是我們是從小到大遍歷邊的,所以如果出現了這種情況,那麼由於比權值為2的這條邊小,那麼他們必定已經被遍歷。
- 由於那條路徑已經被遍歷過,那麼這時候點1和點2就處於一個並查集了,也就是說我們不會再選擇邊權為2的這條邊了。
- 因此我們可以證明出一個結論:圖中權值最小的這條邊必然要被選擇。
- 假設我們已經選擇了直接連線點1和點2的這條邊,那麼我們就可以對點1和點2進行縮點,由於最小生成樹的性質(只要有路徑連線兩個任意結點即可),縮點對建圖沒有任何影響。
- 重複以上操作,直到邊的數量等於點的數量減一(一個圖的最小生成樹的邊的數量必定等於這個圖的點的數量減一)即可得出最小生成樹。
注意:
- Kruskal不支援有向圖
歡迎加入我們的OI討論群
群號:849352599
相關推薦
關於最小生成樹演算法 —— Kruskal 有效性的證明
證明過程: 首先,假設我們已經對所有邊進行了排序,並且當前遍歷到的邊是連線點1和點2的邊 因為這條邊是最小的邊,而點1和點2在最小生成樹中一定會直接或間接的相連,因此任何從點1到點2的路徑都不小於這條邊。如圖,如果不走這條邊就只能走1→3→2(而如果這樣走顯然會使得1→2的
最小生成樹演算法——Kruskal演算法、Prim演算法、堆優化的Prim演算法
什麼叫最小生成樹? 已知一個無向連通圖,那麼這個圖的最小生成樹是該圖的一個子圖,且這個子圖是一棵樹且把圖中所有節點連線到一起了。一個圖可能擁有多個生成樹。一個帶權重的無向連通圖的最小生成樹(minimum spanning tree),它的權重和是小於等於其他
最小生成樹之Kruskal演算法
簡介 求加權連通圖的最小生成樹的演算法 演算法描述 先按邊從小到大排序,從最短邊開始迴圈,若此邊連線的兩個點屬於不同的聯通分量則加入此邊並連線兩點(用並查集實現),直到加入n-1條邊。若m條邊都迴圈一遍了加入的邊仍不足n-1則此圖不能構成一棵樹。 證明 反證法可
最小生成樹演算法之Kruskal演算法
最近做大題目主要運用的都是資料結構方面的題,既有之前的最短路徑的相關的演算法,也有現在的最小生成樹,這裡先講解Kruskal演算法,主要是我先在剛會這個,prim演算法,明天再看。 Kruskal演算法演算法其實和之前的djs演算法有點類似,主要還是每次迴圈找出
『最小生成樹』Kruskal演算法——加邊法 (並查集優化 + C++語言編寫 + 例題)
『演算法原理』 在一個連通網的所有生成樹中,各邊的代價之和最小的那顆生成樹稱為該連通網的最小代價生成樹(Minimum Cost Spanning Tree),簡稱最小生成樹(MST)。 Kruskal演算法之所以叫加邊法,就是因為其本質
最小生成樹 (Kruskal演算法)POJ 2349 Arctic Network
Description The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different com
最小生成樹之kruskal(克魯斯卡爾)演算法(C++實現)
參考部落格:https://blog.csdn.net/YF_Li123/article/details/75195549 最小生成樹之kruskal(克魯斯卡爾)演算法 kruskal演算法:同樣解決最小生成樹的問題,和prim演算法不同,kruskal演算法採用了邊貪心
資料結構 第17講 溝通無限校園網——最小生成樹(kruskal演算法)
本內容來源於本人著作《趣學演算法》,線上章節:http://www.epubit.com.cn/book/details/4825 構造最小生成樹還有一種演算法,Kruskal演算法:設G=(V,E)是無向連通帶權圖,V={1
演算法導論--最小生成樹(Kruskal和Prim演算法)
關於圖的幾個概念定義: 連通圖:在無向圖中,若任意兩個頂點vi與vj都有路徑相通,則稱該無向圖為連通圖。 強連通圖:在有向圖中,若任意兩個頂點vi與vj都有路徑相通,則稱該有向圖為強連通圖。 連通網:在連通圖中,若圖的邊具有一定的意義,每一條邊都對應
最小生成樹之kruskal演算法(附程式碼)
prim演算法是通過找距離最近的節點來擴充最小生成樹的,稠密圖選擇prim演算法效率比較高,但是對於稀疏圖呢,prim演算法就顯的比較雞肋了。對於稀疏圖,有一個叫做kruskal的演算法。此演算法求稀疏圖的效率比較高,時間複雜度為O(ElogE)。 kruskal演算法主要
HDU 1162.Eddy's picture【最小生成樹(Kruskal演算法)】【5月30】
Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8871 Accepte
51nod 1212 無向圖最小生成樹(Kruskal演算法)
收藏 關注 N個點M條邊的無向連通圖,每條邊有一個權值,求該圖的最小生成樹。 Input 第1行:2個數N,M中間用空格分隔,N為點的數量,M為邊的數量。(2 <= N <= 1000, 1 <= M <= 5
最小生成樹演算法——Prim演算法和Kruskal演算法的JS實現
之前都是看書,大部分也是c++的實現,但是搞前端不能忘了JS啊,所以JS實現一遍這兩個經典的最小生成樹演算法。 一、權重圖和最小生成樹 權重圖:圖的邊帶權重 最小生成樹:在連通圖的所有生成樹中,所有邊的權重和最小的生成樹 本文使用的圖如下: 它的最小生成樹如下:
例題:最短網路 圖論演算法之最小生成樹 prim//kruskal 學習筆記
圖論演算法之最小生成樹 prim//kruskal 最小生成樹簡單的說就是在一個圖裡選取一些邊,使這些邊以及它們所連線的結點組成一棵樹(兩兩結點之間可以到達),並且使選取的邊的邊權最
貪心演算法基礎之最小生成樹 51nod Kruskal演算法
問題: 分析: 演算法思想: 1、把存在的邊按邊長進行排序,從小到大。目的是從小的邊開始遍歷,以便找最小生成樹 推薦用結構體存邊,不要用鄰接矩陣存關係 把n個點連線在一起,起始最少需要
貪心法之最小生成樹之Kruskal演算法
#include "iostream" using namespace std; #define MAXVEX 50//圖中最大節點數 typedef struct //定義邊的資料結構 { int start;//邊的起點 int end;//邊的終點 float weight;//邊的權值 }Verte
poj1258 Agri-Net 最小生成樹,kruskal演算法
思路:原始的最小生成樹。第一次寫kruskal演算法,一開始老是RE,還不明白怎麼了,原來連kruskal的過程都忘了。對不起資料結構老師。。。 ///2014.7.7 ///poj1258 /* *最小生成樹,kruskal演算法 */ #include <
演算法java實現--貪心演算法--最小生成樹問題--Kruskal演算法
最小生成樹問題(Kruskal演算法)的java實現(貪心演算法) 具體問題描述以及C/C++實現參見網址 http://blog.csdn.net/liufeng_king/article/details/8738161 import java.util.Colle
最小生成樹(Kruskal 演算法和 Prim 演算法)——貪心演算法(C語言)
本內容將介紹最小生成樹(MST:Minimum Cost Spanning Tree)的兩種解法,分別為 Kruskal 演算法(克魯斯卡爾演算法)和 Prim 演算法(普里姆演算法),並且它們都屬於貪心演算法。 問題描述: 產生最小生成樹(MS
ZOJ 1203 Swordfish 劍魚行動 最小生成樹,Kruskal演算法
Swordfish Time Limit: 2 Seconds Memory Limit: 65536 KB There exists a world within our world A world beneath what we call cybersp