Prim演算法與Kruskal演算法生成最小生成樹

2021-10-25 22:36:55 字數 1687 閱讀 2107

1. 問題

最小生成樹問題,即給定乙個無方向的帶權圖g=(v, e),最小生成樹為集合t, t是以最小代價連線v中所有頂點所用邊e的最小集合。

2. 解析

prim演算法:選乙個頂點加入集合,找出這個頂點出發的權值最小邊,得到新頂點加入集合,然後繼續找出集合中的頂點 連線其他頂點的最小邊,直到全部頂點進入集合。

kruskal演算法:對邊進行排序,從最小的邊開始進行貪心,每個點視為乙個集合,若是邊兩端不是同乙個集合之中,將兩個集合合併。直到剩下乙個集合,即為最小生成樹。

3. 設計

prim:

#include

#include

#include

#define inf 1e10

using

namespace std;

int graph[

100]

[100];

int vis[

100]

;int road[

100]

;int weight[

100]

;int vnum, rnum;

int weightsum, first;

int h, d, w;

void

prim

(int first)

weightsum =0;

int minw, minnum;

for(

int i =

1; i < vnum; i++)}

vis[minnum]=1

; weightsum +

= minw;

for(

int j =

0; j < vnum; j++)}

}}intmain()

cin >> first;

prim

(first)

;for

(int i =

0; i < vnum; i++)if

(i != first)cout << i <<

"->"

<< road[i]

<< endl;

return0;

}

kruskal:

#include

#include

#include

#define inf 10000

using

namespace std;

struct edgeedge[inf]

;int par[inf]

;int r[inf]

;int vnum, rnum;

int sum;

void

init

(int n)

}int

find

(int x)

intunite

(int x,

int y)

return1;

}}bool

compare

(const edge& a,

const edge& b)

intmain()

}return

0;

4.原始碼

最小生成樹 Prim演算法與Kruskal演算法

乙個連通圖的生成樹是乙個極小的連通子圖,包含有圖中全部的頂點,但只有足以構成一棵樹的n 1條邊。我們把構造連通網的最小代價生成樹稱為最小生成樹 mi nimu mcos tspa nnin gtre e minimum cost spanning tree minim umco stsp anni ...

Prim演算法 Kruskal演算法

一 prim演算法 1 要求 1 生成一顆連通的樹 2 生成樹 包含全部頂點,v 1條邊,沒有迴路,並且新增一條邊會變成有迴路 3 權重和最小 2 過程模擬 最重要 貪心的思想,每一步都要選擇權值最小的,這棵樹所有跟頂點相連的邊中最小的。從根節點開始,讓樹慢慢的長大。過程 從v1開始 跟v1有聯絡的...

Prim演算法 Kruskal演算法

prim演算法 kruskal演算法 prim演算法和kruskal演算法,都是用來找出圖中最小生成樹的演算法,兩個演算法有些小差別。prim演算法 又稱普里姆演算法,以圖上的頂點為出發點,逐次選擇到最小生成樹頂點集距離最短的頂點為最小生成樹的頂點,並加入到該頂點集,直到包含所有的頂點。1.選擇一出...