最小生成樹Prim演算法

2021-10-06 02:31:52 字數 2491 閱讀 1712

mst(minimum spanning tree,最小生成樹)

經典運用城市鋪路問題

通常有最小生成樹有primkruskal兩種演算法

這邊先介紹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...