**
**:***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的最小生成樹...