MST最小生成樹及Prim普魯姆演算法

2021-08-27 14:38:43 字數 1511 閱讀 6258

mst在前面學習了kruskal演算法,還有一種演算法叫做prim的。這兩者的區別是prim演算法適合稠密圖,比如說鳥巢這種幾乎所有點都有相連的圖。其時間複雜度為o(n^2),其時間複雜度與邊的數目無關;而kruskal演算法的時間複雜度為o(eloge),跟邊的數目有關,適合稀疏圖。

prim演算法

基本思想:假設g=(v,e)是連通的,te是g上最小生成樹中邊的集合。演算法從u=(u0∈v),te=開始。重複執行下列操作:

1.在所有u∈u,v∈v-u的邊(u,v)∈e中找一條權值最小的邊(u0,v0)併入集合te中,同時v0併入u,直到v=u為止;接下裡以 v0為邊的起點,繼續尋找權值最小的邊併入集合te中,依次往復;

2.最後,te中必有n-1條邊,t=(v,te)為g的最小生成樹。

prim演算法的核心:始終保持te中的邊集構成一棵生成樹,也就是它與kruskal演算法的主要區別是,prim是一直保持一種串聯的狀態而不遵從整體的貪心演算法。其實初始點uo的選擇可以隨意,一般做題題目條件會給出或者取最小的權值邊。

其實現的**如下:

#include #include #include
#define infinity 1000000

#define max_vertexes 6

typedef int graph[max_vertexes][max_vertexes];
void prim(graph g,int vcount,int father)

edge;

typedef edge *edgenode;

int arcnum; /*邊的個數*/

/*建立圖的鄰接矩陣*/

void creatmatrix(adjmatrix ga)

else

} }printf("請輸入邊的個數:");

scanf("%d",&arcnum);

printf("請輸入邊的資訊,按照起點,終點,權值的形式輸入:\n");

for(k=1;k<=arcnum;k++)

}/*初始化圖的邊集陣列*/

void initedge(edgenode ge,int m)

}/*根據圖的鄰接矩陣生成圖的邊集陣列*/

void getedgeset(adjmatrix ga,edgenode ge)

} }}/*按公升序排列圖的邊集陣列*/

void sortedge(edgenode ge,int m)

} if(k!=i) }}

/*利用普里姆演算法從初始點v出發求鄰接矩陣表示的圖的最小生成樹*/

void prim(adjmatrix ga,edgenode t)

} /*進行n-1次迴圈,每次求出最小生成樹中的第k條邊*/

for(k=1;k

Prim演算法求MST 最小生成樹

prim演算法求最小生成樹使用的圖的儲存結構是圖的鄰接矩陣 include define max vertax size 20 define infinite 65535 define ok 1 define error 0 圖的鄰接矩陣表示的結構定義 typedef int status type...

最小生成樹(MST)

在帶權圖中,所有的生成樹中邊權的和最小的那棵 或幾棵 被稱為最小生成樹。幾點注意 求最小生成樹使用kruskal演算法。使用並查集處理節點的集合屬性,初始時所有結點屬於只包含其自身的孤立集合。實現 include include using namespace std define n 101 in...

最小生成樹 MST

1 prim演算法 對點進行貪心操作。適合稠密圖 const int m 1005 int vis m 表示該i點是否被選擇 vis i 0 還未被選擇 int map m m map i j 表示i到j的距離 int dis m 1到i的距離和 void prim cout sum 2 krusk...