最小生成樹 Prim演算法與Kruskal演算法

2021-09-16 13:48:03 字數 2834 閱讀 2693

乙個連通圖的生成樹是乙個極小的連通子圖,包含有圖中全部的頂點,但只有足以構成一棵樹的n-1條邊。我們把構造連通網的最小代價生成樹稱為最小生成樹(mi

nimu

mcos

tspa

nnin

gtre

e)

(minimum cost spanning tree)

(minim

umco

stsp

anni

ngtr

ee)。

普里姆(pr

im

)( prim )

(prim)

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

演算法思想:假設n=(

v,

)n=( v,\ )

n=(v,)

是連通網,tete

te是n

nn上最小生成樹中邊的集合。演算法從u

=u =\%( u_0\in p)

u=,t e=

te=\

te=開始。重複執行下述操作:在所有u∈u

,v∈v

−u

u\in u,v\in v- u

u∈u,v∈

v−u的邊(u,

v)∈e

(u,v)\in e

(u,v)∈

e中找一條代價最小的邊(u0

,v0)

(u_0,v_0)

(u0​,v

0​)併入集合tete

te,同時v

0v_0

v0​併入u

uu,直至u=v

u=vu=

v為止。此時tete

te中必有n−1

n-1n−

1條邊,則t=(

v,te

)t= (v,)

t=(v,t

e)為n

nn的最小生成樹。

這裡我們只需要網g

gg的頂點與邊的列表即可

# -*- coding: utf-8 -*-

"""created on mon mar 25 09:18:08 2019

@author: administrator

"""from numpy import *

def prim(g):

v=g.vertices #例v=['a','b','c',...]

e=g.edges_list[:] #例e=[['a','b',weight],...]

v_new=[v[0]]

e_new=

a=[none,none] #a儲存找到的點與邊

i=1 #用於防止死迴圈

while(set(v_new)!=set(v)):

min=inf

for edge in e: #對e迴圈,找到符合要求的最小權的邊

if edge[0] in v_new and edge[1] not in v_new:

if edge[2]10000:break

return v_new,e_new

克魯斯卡爾(kr

uska

l)

(kruskal)

(krusk

al)演算法是先將邊按照其權的大小排序,從最小權的邊起,依次將不足以構成環的邊加入最小生成樹中。

演算法思想:假設n=(

v,

)n=(v,\)

n=(v,)

是連通網,則令最小生成樹的初始狀態為只有n

nn個頂點而無邊的非連通圖t=}

t=\\}

t=},圖中每個頂點自成乙個連通分量。在e

ee中選擇代價最小的邊,若該邊依附的頂點落在t

tt中不同的連通分量上,則將此邊加入到t

tt中,否則捨去此邊而選擇下一條代價最小的邊。依次類推,直至t

tt中所有頂點都在同一連通分量上為止。

同樣,這裡我們也只需要網g

gg的頂點與邊的列表即可

# -*- coding: utf-8 -*-

"""created on mon mar 25 10:45:38 2019

@author: administrator

"""def kruskal(g):

vertices=g.vertices

#例v=['a','b','c',...]

edges=sorted(g.edges_list,key=lambda x:x[2])

#例g.edges_list=[['a','b',weight1],...],再將之按權的大小排序,賦值給edges

edges=

connected=

for v in vertices:

for e in edges:

for j in range(len(connected)):

if e[0] in connected[j]:

m=jif e[1] in connected[j]:

n=jif m!=n: #若e[0]與e[1]所屬的連通分量不同

connected[m]=connected[m]+connected[n] #將第m個連通分量與第n個連通分量合併於m處

del connected[n] #刪去第n個連通分量

return edges

最小生成樹與Prim演算法

首先是一棵樹 廢話 其次沒有迴路 廢話 包含全部頂點和v 1條邊 邊的權重和最小!所以如果是單棵最小生成樹,至少說明圖是連通的。不然就是森林。既然是根據圖生成樹,那麼至少要有遍歷圖。那麼,便要從乙個源點出發,來一場愉快的深搜或廣搜。深搜生成就叫dfs樹 深度優先搜尋樹 廣搜生成就叫bfs樹 廣度優先...

最小生成樹(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...