實驗1 最小生成樹的構造

2021-10-22 03:30:43 字數 2766 閱讀 6396

**

**:***prim演算法***又稱為加邊法,即每次選擇最小權值的邊加入到生成樹中,然後再更新權值,如此反覆,保證每次最優來達到最優解。

kruskal演算法:

1.對邊按權重排序為e1、e2、…

2.若已選擇v-1條邊,停止。否則,按邊的權重排序選擇下一條邊。

3.判斷選擇的邊的兩點是否在同一連通分支。若不在同一分支,則選擇該邊。返回步驟2。

以下是prime演算法的**:

#include

#include

#include

using

namespace std;

//首先是使用鄰接矩陣完成prim演算法

struct graph

;//建立圖

void

creategraph

(graph & g)

} cout <<

"請輸入每條邊之間的頂點編號(頂點編號從1開始),以及該邊的權重:"

<< endl;

for(i =

0; i < g.edge; i++)}

//作為記錄邊的資訊,這些邊都是達到end的所有邊中,權重最小的那個

struct assis_array

;//進行prim演算法實現,使用的鄰接矩陣的方法實現。

void

prim

(graph g,

int begin)

}//把起點的close_edge中的值設定為-1,代表已經加入到集合u了

close_edge[begin -1]

.weight =-1

;//訪問剩下的頂點,並加入依次加入到集合u

for(j =

1; j < g.vexnum; j++)}

}//將權重最小的那條邊的終點也加入到集合u

close_edge[index]

.weight =-1

;//輸出對應的邊的資訊

cout << g.information[close_edge[index]

.start]

<<

"-----"

<< g.information[close_edge[index]

.end]

<<

"="<< g.arc[close_edge[index]

.start]

[close_edge[index]

.end]

<< endl;

//更新我們的close_edge陣列。

for(k =

0; k < g.vexnum; k++)}

}}intmain()

以下是kruskal演算法的**:

#include

#include

#include

using

namespace std;

//邊集結構,用於儲存每條邊的資訊

typedef

struct edge_tag edge;

//建立乙個圖,但是圖是使用邊集結構來儲存

void

creategraph

(edge *

&e,int vexnum,

int edge)

}//我們需要對邊集進行排序,排序是按照每條邊的權重,從小到大排序。

intcmp

(const

void

* first,

const

void

* second)

//其中parent代表頂點所在子樹的根結點

//child代表每個頂點孩子結點的個數

intfind_root

(int child,

int* parent)

//往前遞迴,尋找它父親的所在子樹的根結點

parent[child]

=find_root

(parent[child]

, parent)

;return parent[child];}

//合併兩個子樹

bool

union_tree

(edge e,

int* parent,

int* child)

else

return

true;}

return

false;}

//克魯斯卡演算法的實現

void

kruskal()

//對邊集陣列進行排序,按照權重從小到達排序

qsort

(edge_tag, edge,

sizeof

(edge)

, cmp)

;int count_vex;

//記錄輸出的邊的條數

count_vex = i =0;

while

(i != edge)

//這裡表示所有的邊都已經加入成功

if(count_vex == vexnum -1)

++i;}if

(count_vex != vexnum -1)

delete

edge_tag;

delete

parent;

delete

child;

}int

main()

最小生成樹 1

最小生成樹是在圖論中的乙個重要的問題,我們找乙個圖的最小生成樹,也就是找鏈結所有的頂點,並且使得各邊的代價之和最小。當然最小生成樹的程式的編寫也是相當的複雜,資料結構書上也有通過prim演算法來建立最小生成樹,當然在這個地方我們是通過克魯斯卡爾演算法 假設乙個連通網n v,則令最小生成樹的初始狀態為...

Kruskal演算法構造最小生成樹

問題 描述演算法問題,首選形式化方式 數學語言 其次才是非形式化方式 日常語言 在一給定的無向圖g v,e 中,u,v 代表連線頂點 u 與頂點 v 的邊 即 而 w u,v 代表此邊的權重,若存在 t 為 e 的子集 即 且為無向迴圈圖,使得的 sum w u,v 最小,則此 t 為 g 的最小生...

prim演算法構造最小生成樹

1.問題 假設g v,e 是連通的,te是g上最小生成樹中邊的集合。演算法從u u0 v te 開始。重複執行下列操作 在所有u u,v v u的邊 u,v e中找一條權值最小的邊 u0,v0 併入集合te中,同時v0併入u,直到v u為止。此時,te中必有n 1條邊,t v,te 為g的最小生成樹...