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.選擇一出...