最小生成樹與Prim演算法

2022-05-24 09:21:10 字數 2339 閱讀 4220

首先是一棵樹(廢話

其次沒有迴路(廢話

包含全部頂點和v-1條邊

邊的權重和最小!!!!!

所以如果是單棵最小生成樹,至少說明圖是連通的。不然就是森林。

既然是根據圖生成樹,那麼至少要有遍歷圖。那麼,便要從乙個源點出發,來一場愉快的深搜或廣搜。

深搜生成就叫dfs樹(深度優先搜尋樹

廣搜生成就叫bfs樹(廣度優先搜尋樹

我們只需要在if語句中,在遞迴呼叫語句之前做一點手腳,便可以達到目的。

(別裝了!dijkstra我知道是你!)

o(n^2),是根據圖生成最小樹的演算法。

是乙個穿了馬甲的dijkstra演算法。用的是藍白點的思想。

dijkstra是啥?

每次迴圈都把乙個藍點u變成白點。並且這個藍點u與白點相連的邊權勢當前所有藍點中最小的min[u]

仔細想想,是貪心的思路喲…

好的,我們來手工模擬一下。求下面這個圖的最小生成樹。(裡面是偽**喲)

(emm…其實這個是綠白點…沒事你就假裝一下色盲。)

初始所有的點全都是藍點,所以說這裡有乙個陣列min[i]來表示一下。那麼除了起點,其他的全部初始化為無窮大(0x3f)。即min[1]=0。權值之和用int mst=0來儲存。

那麼第一次迴圈就沒什麼說的了,min[1]=0是最小的藍點,然後把1變白。然後列舉和a相連的藍點,修改它們與白點相連的最小邊權(就是min陣列啦)

第二次迴圈找到min[2]是最小的藍點,變白。然後更新相連的藍點。bulabulabula。

min[3]=map[2][3]=1; min[5]=map[2][5]=2;
第三次迴圈…找到min[3]=1是最小的那個…變白…更新藍點最小值…

min[4]=map[3][4]=1;
哦,這裡要注意一下,因為min[5]=2<6,所以5不用更新。

第四次迴圈找到點4,第五次迴圈找到點5.反正他們也沒相連的藍點了,所以直接變白叭。

那麼,最後得到的權值之和是…

min[1]+min[2]+min[3]+min[4]+min[5]=

0+2+1+1+2=6;

以1為起點生成最小生成樹,min[v]表示藍點與白點相連的最小邊權。

mst表示最小生成樹的權值之和。

⑴初始化min[v]=∞(v≠1);min[1]=0;mst=0;⑵

for(int i=1;i<=n;i++)

⑶演算法結束,mst即為最小生成樹的權值之和。

高能偽**

這裡有一道洛谷的模板題

#include#include

#include

//prim演算法

using

namespace

std;

const

int maxx=0x3f3f3f3f

;const

int maxn=5005

;int n,m,x,y,z,map[maxn][maxn],minn[maxn],mst=0

,vis[maxn];

intmain()

}memset(minn,

0x3f,sizeof

(minn));

minn[

1]=0

;

for(int i=1;i<=n;i++)

}vis[u]=true

; mst+=minn[u];

for(int v=1;v<=n;v++)}}

printf(

"%d\n

",mst);

}

(倒是頭一次知道洛谷如果不加cstdio的標頭檔案是不可以用printf的…尷尬。

最小生成樹(prim演算法)

最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...

最小生成樹 Prim演算法

prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...

最小生成樹 prim 演算法

一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...