普里姆演算法(鄰接矩陣)

2021-10-03 21:35:31 字數 3918 閱讀 2681

思想

從某個頂點開始(不要把它看成乙個單獨的頂點,把它看成只有乙個結點的子生成樹)

在第一步的生成樹的相鄰邊中,選一條最小的邊,將最小的邊和邊的另乙個結點併入子生成樹中(生成樹就長大了一點)

繼續,直到所有的頂點都被併入了生成樹

步驟1.取圖中任意乙個頂點 v 作為生成樹的根,之後往生成樹上新增新的頂點 w

2.在新增的頂點 w 和已經在生成樹上的頂點v 之間必定存在一條邊,

3.並且該邊的權值在所有連通頂點 v 和 w 之間的邊中取值最小。

4.之後繼續往生成樹上新增頂點,直至生成樹上含有 n-1 個頂點為止。

效能o(n^2),適合稠密圖(邊多的圖)

另乙個【克魯斯卡爾演算法】o(eloge):適合稀疏圖(邊少的圖)

舉例1.藍色的頂點:還未考慮的頂點

2.黃色的頂點:已經考慮完的頂點

3.藍色的線:未考慮的邊

4.紫色的線:考慮範圍內的邊

5.紅色的線:生成樹的邊(最短的邊)

將a納入考慮的頂點,變成黃色

第一步:考慮黃色頂點【a】

1.考慮與a相連的所有邊(紫色的邊),取出最短的邊:18

2.將最短邊,納入生成樹的邊(變紅色)

3.將頂點b納入已考慮的頂點(變黃色)

第二步:考慮黃色的頂點【a,b】

1.考慮與a,b相連的所有邊(紫色的邊),取出最短的邊8

2.將最短邊,納入生成樹的邊(變紅色)

3.將頂點c納入已考慮的頂點(變黃色)

第三步:繼續考慮黃色的頂點【a,b,c】

1.考慮與a,b,c相連的所有邊(紫色的邊),取出最短的邊20

2.將最短邊,納入生成樹的邊(變紅色)

3.將頂點d納入已考慮的頂點(變黃色)

最終

實現記:

1.黃色的頂點,為頂點集【u】,即已落在生成樹上的頂點

2.藍色的頂點,為頂點集【v-u】,即尚未落在生成樹上的頂點

設定乙個輔助陣列

1.下標:頂點v

2.lowcost:記錄【黃色的點們】到【v】的最短邊

3.adjvex:記錄【黃色的點集】中哪乙個頂點,到v最短

最小生成樹

void

prim

(mgraph* mgraph,

int v)

;//儲存鄰接節點下標陣列

adjvex[1]

=1; lowcost[1]

=0;for

(i =

2;i <= mgraph->vexnum;i++

)for

(j =

2;j <= mgraph->vexnum;j++)}

}printf

("%c -> %c :%d\n"

, mgraph->vexs[adjvex[index]

], mgraph->vexs[index]

, min)

; lowcost[index]=0

;//將該頂點加入到生成樹中

for(i =

1;i <= mgraph->vexnum;i++)}

}}

完整**
#

include

#include

#define

max_vex_num

20//最大頂點數

#define

max_num

(int

)1000

typedef

char vertexttype;

typedef

enum

graphkind;

//判定圖的型別,有向或無向

typedef

struct

mgraph;

//索引判斷

intindex

(char vex, mgraph* mg)

return0;

}//生成鄰接矩陣

void

creat_mg

(mgraph* mg)

else

printf

("please input vexnum:");

scanf_s

("%d"

,&mg->vexnum)

;//輸入結點數

printf

("please input arcnum:");

scanf_s

("%d"

,&mg->arcnum)

;//輸入邊數

getchar()

;for

(i =

1;i <= mg->vexnum;i++

)for

(i =

1;i <= mg->vexnum;i++

)for

(j =

1;j <= mg->vexnum;j++

) mg->arcs[i]

[j]= max_num;

//初始化邊,全部設為max_num

for(i =

1;i <= mg->vexnum;i++

) mg->arcs[i]

[i]=0;

//初始化邊,全部設為0

for(k =

1;k <= mg->arcnum;k++

)else

mg->arcs[v1_index]

[v2_index]

= weight;

getchar()

;}}void

print_mg

(mgraph* mg)

else

}printf

("\n");

}}

#

include

#include

#include

#include

"mgraph.h"

#define

num30

#define

max_num

(int

)1000

void

prim

(mgraph* mgraph,

int v)

;//儲存鄰接節點下標陣列

adjvex[1]

=1; lowcost[1]

=0;for

(i =

2;i <= mgraph->vexnum;i++

)for

(j =

2;j <= mgraph->vexnum;j++)}

}printf

("%c -> %c :%d\n"

, mgraph->vexs[adjvex[index]

], mgraph->vexs[index]

, min)

; lowcost[index]=0

;//將該頂點加入到生成樹中

鄰接矩陣 最小生成樹 普里姆演算法

風雨難洗心痕,滄桑不滅情傷。莫要輕言亙古,離散才看荒涼。include stdio.h typedef char vertextype 頂點 typedef int edgetype 邊的權值 define maxvex 100 define infinity 65535 鄰接矩陣 typedef ...

普里姆演算法

include include include include using namespace std define max name 5 define max vertex num 20 權的上限值 typedef char vertex max name 頂點名字串 typedef int ad...

普里姆演算法

普里姆演算法的基本思想如下 假設n 是連通網,te是n上最小生成樹中邊的集合。從u 開始,te 開始,重複執行下述操作 在所有的u屬於u,v屬於v u的邊 u,v 的邊中找到權值最小的一條邊,並且併入te,同時u併入u,直到u v 先設乙個輔助陣列closedge max 初始時先把第乙個結點存入c...