mst(minimum spanning tree,最小生成樹)
經典運用城市鋪路問題
通常有最小生成樹有prim和kruskal兩種演算法
這邊先介紹prim演算法
時間複雜度是o(n^2)
牛客上有道選擇題答案說是o(n+e)我是不太明白
prim演算法是從點的角度出發
所以兩者相比較prim演算法適合於解決邊稠密的網
具體流程:
初始化:
圖中所有頂點集合為g
加入mst的點集合為v
任取一點a開始,加入v中
步驟
1) 找集合g - v中的點b,與v中某點a最小的權值
2) 將這點加入v中,b與a相連就構成一條邊
3)返回到第一步,直到所有頂點都加入v中,就得到一顆mst
下面是模擬過程
這裡測試資料與上圖無關
sample input
9 15
0 1 10
0 5 11
1 2 18
1 6 16
2 3 22
2 8 8
3 4 20
3 7 16
3 6 24
3 8 21
4 5 26
4 7 7
5 6 17
6 7 19
1 8 12
sample output
0 10 5
1 88 2
1 66 7
7 47 3
#include
#include
#include
using
namespace std;
const
int maxedge =20;
const
int maxvex =20;
const
int inifinity =
100000
;//封裝頂點,邊,陣列頂點到頂點間的權值
typedef
struct
mgraph;
mgraph g;
void
createmgraph
(mgraph *g)
;void
minispantree_prim
(mgraph g)
;int
main
(int argc,
const
char
* ar**)
void
createmgraph
(mgraph *g)
//利用連通的對稱性
for(
int i =
0; i < g-
>numvertexes; i++
)for
(int j =
0; j < g-
>numvertexes; j++
) g-
>arc[j]
[i]= g-
>arc[i]
[j];
}//prim演算法生成最小生成樹
void
minispantree_prim
(mgraph g)
;//adjvex[i] 當下已生成的樹中到i權值最小的頂點
int lowcost[maxvex]=;
//lowcost[i] 對應i到adjvex[i]兩頂點中的權值
lowcost[0]
=0;//賦值為0表示已加入生成樹中
for(
int i =
1; i < g.numvertexes; i++
)for
(int i =
1; i < g.numvertexes; i++
)printf
("%d %d\n"
, adjvex[k]
, k)
; lowcost[k]=0
;//標記該頂點已完成任務
//重新尋找從剛加入的頂點到各頂點的權值是否比原先的adjvex[j]到j的權值更小
for(
int j =
1; j < g.numvertexes; j++)if
(lowcost[j]!=0
&& g.arc[k]
[j]< lowcost[j])}
}
最小生成樹(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...