乙個連通圖的生成樹是乙個極小的連通子圖,包含有圖中全部的頂點,但只有足以構成一棵樹的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...