1. 程式人生 > >【圖】最小生成樹(最小成本):Prim演算法

【圖】最小生成樹(最小成本):Prim演算法

最小成本:n 個頂點,用 n1 條邊把一個連通圖連線起來,並且使得權值的和最小。
最小生成樹:構造連通網的最小代價生成樹。

根據原來寫的部落格:【圖】圖的定義,裡面提到一個連通圖的生成樹是一個極小連通子圖,它含有圖中全部的頂點,但只有足以構成一棵樹的 n1 條邊。

找連通網的最小生成樹,經典的有兩種演算法:普里姆(Prim)演算法克魯斯卡爾(Kruskal)演算法

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

普里姆(Prim)演算法

基本思想

假設 N=(V,{E}) 是連通網,TEN 上最小生成樹中邊的集合。
演算法從 U=u0(u0ϵV),TE={} 開始,重複執行下述操作:

  • 在所有 uϵV,vϵVU 的邊 (u,v)ϵE 中找一條代價最小的邊 (u0,v0) 併入集合 TE,同時 v0 併入 U,直至 U=V 為止。

此時 TE 中必有 n1 條邊,則 T=(V,{TE})N 的最小生成樹。

普里姆(Prim)演算法是以某頂點為起點,逐步找各頂點上最小權值的邊來構建最小生成樹。

圖解

下圖給出權值矩陣。
這裡寫圖片描述

從第一個頂點 A 開始通過普里姆演算法生成最小生成樹。
1、初始狀態:V 是所有頂點的集合,即V={A,B,C,D,E,F,G,H,I}UTE 都為空。
初始化一個數組lowcost={,,,,,,,

},用來更新當前最小權值。
2、將頂點 A 加入到 U 中。 此時,U={A},VU={B,C,D,E,F,G,H,I}。如圖2。
將頂點 A 的更小的權值更新進lowcost={0,10,,,,11,,,}
此時代價最小邊為 10。
3、選取頂點 B,將頂點 B 加入到 U 中。 此時,U={A,B},VU={C,D,E,F,G,H,I}。如圖3。
將頂點 B 的更小的權值更新進lowcost={0,0,18,,,11,16,,12}
此時代價最小邊為 11。
這裡寫圖片描述這裡寫圖片描述

4、選取頂點 F,將頂點 F 加入到 U 中。 此時,U={A,B,F},VU={C,D,E,G,

H,I}。如圖4。
將頂點 F 的更小的權值更新進lowcost={0,0,18,,26,0,16,,12}
此時代價最小邊為 12。
5、選取頂點 I,將頂點 I 加入到 U 中。 此時,U={A,B,F,I},VU={C,D,E,G,H}。如圖5。
將頂點 I 的更小的權值更新進lowcost={0,0,8,21,26,0,16,,0}
此時代價最小邊為 8。
這裡寫圖片描述這裡寫圖片描述
6、選取頂點 C,將頂點 C 加入到 U 中。 此時,

相關推薦

小生成樹成本Prim演算法

最小成本:n 個頂點,用 n−1 條邊把一個連通圖連線起來,並且使得權值的和最小。 最小生成樹:構造連通網的最小代價生成樹。 根據原來寫的部落格:【圖】圖的定義,裡面提到一個連通圖的生成樹是一

小生成樹成本克魯斯卡爾Kruskal演算法

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

51nod 1212 無向小生成樹小生成樹

 收藏  關注 N個點M條邊的無向連通圖,每條邊有一個權值,求該圖的最小生成樹。 Input 第1行:2個數N,M中間用空格分隔,N為點的數量,M為邊的數量。(2 &

小生成樹Kruskal算法

否則 father print %d main pan lib algorithm color 最小生成樹就是一張圖能生成的邊權最小的樹。 方法(Kruskal算法):將所有邊權從小到大排序,然後一條一條邊檢查,如果加入這條邊形成了回路,那麽不加入樹中,否則加入。至於如

BZOJ 2561 小生成樹

任重而道遠  給定一個邊帶正權的連通無向圖G=(V,E),其中N=|V|,M=|E|,N個點從1到N依次編號,給定三個正整數u,v,和L (u≠v),假設現在加入一條邊權為L的邊(u,v),那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上? Inp

BZOJ1937: [Shoi2004]Mst 小生成樹洛谷P4412

二分圖完美匹配 神仙一樣。。。 首先有個顯然的貪心:樹邊權值只減不增,非樹邊權值只增不減。 對於一條連線xxx和yyy的非樹邊iii,xxx到yyy路徑上所有的邊jjj都要滿足wj−dj≤wi+diw_j-d_j\leq w_i+d_iwj​−dj​≤wi​+

bzoj千題計劃322bzoj2561: 小生成樹

#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std;

小生成樹鄰接表寫法

#include<stdio.h> #include<stdlib.h> #define max 20 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; int info;

小生成樹Minimum Spanning TreePrim演算法

1. 什麼是最小生成樹(Minimum Spanning Tree) 2. 貪心演算法: 1) 什麼是“貪”:每一步都要最好的 2) 什麼是“好”:權重最小的邊 3) 需要約束:      a) 只

P3366 模板小生成樹堆優化prim

生成 operator prior 鄰接表 %d inline pac ont truct 堆優化prim 復雜度大概O(nlogn) #include<cstdio> #include<cstring> #include<queu

luogu P3366 模板小生成樹克魯斯卡爾演算法)

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

複習---p2820區域網--洛谷//小生成樹 2

題目背景某個區域網內有n(n<=100)臺計算機,由於搭建區域網時工作人員的疏忽,現在區域網內的連線形成了迴路,我們知道如果區域網形成迴路那麼資料將不停的在迴路內傳輸,造成網路卡的現象。因為連線計算機的網線本身不同,所以有一些連線不是很暢通,我們用f(i,j)表示i,j之間連線的暢通程度,f(i,j)值

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

數據結構 小生成樹——kruskal算法

適用於 相同 inf prim 什麽 一段 大樹 集合 n-1   上一期說完了什麽是最小生成樹,這一期咱們來介紹求最小生成樹的算法:kruskal算法,適用於稀疏圖,也就是同樣個數的節點,邊越少就越快,到了數據結構與算法這個階段了,做題靠的就是速度快,時間復雜度小。   

數據結構 小生成樹——prim算法

copy cost 是否 不用 wait 大樹 分享圖片 pri clas   上一期介紹到了kruskal算法,這個算法誕生於1956年,重難點就是如何判斷是否形成回路,此處要用到並查集,不會用當然會覺得難,今天介紹的prim算法在kruskal算法之後一年(即1957年

POJ 3241曼哈頓小生成樹模板整理

關於 曼哈頓最小生成樹 的證明見:http://www.2cto.com/kf/201505/399861.html 模板: #include<cmath> #include<cstdio> #include<cstring> #incl

數據結構 小生成樹——利用kruskal算法搞定例題×3+變形+一道大水題

kruskal算法 福利 將不 所有 來講 後來 結構體 時間限制 n)   在這一專輯(最小生成樹)中的上一期講到了prim算法,但是prim算法比較難懂,為了避免看不懂,就先用kruskal算法寫題吧,下面將會將三道例題,加一道變形,以及一道大水題,水到不用高級數據結構

P3366 模板小生成樹boruvka/sollin

int fin targe http strong 合並操作 tdi 一個 ble P3366 【模板】最小生成樹 boruvka/sollin 復雜度$O(mlogn)$ 簡要說明一下過程 引入一個數組$link[i]$表示連通塊$i$下一步可更新的最短的邊的編號

51 nod 1212 無向小生成樹Kruckal演算法/Prime演算法圖解

1212 無向圖最小生成樹 N個點M條邊的無向連通圖,每條邊有一個權值,求該圖的最小生成樹。  收起 輸入 第1行:2個數N,M中間用空格分隔,N為點的數量,M為邊的數量。(2 <= N <= 1000, 1 <= M <= 50000) 第2 -

資料結構——8——小生成樹MST

問題的提出 如下圖,假設這裡有一系列的房屋,問如何鋪設電線,可以使得連線所有房屋的電線的總成本最低?這是20世紀20年代早期研究最小生長樹的最初動機。 (捷克數學家OtakarBorůvka完成的工作)。 最短路徑樹與最小生成樹(MST) 上次,我們看到了Dijkstra演