#include
#include
#define max 1000
#define maxlen 20
#define max_arc_num 100
/*---鄰接矩陣---*/
typedef
char vertextype;
//定義頂點型別
typedef
int weighttype;
typedef
struct graph
mgraph;
typedef
struct node edgenode;
typedef
struct
egraph;
/*---查詢頂點的下標---*/
intlocate
(mgraph g, vertextype ch)
intlocate
(egraph g, vertextype ch)
/*---構建圖---*/
void
createmgraph
(mgraph &g)
//初始化鄰接矩陣
for(i=
0; i)for
(j=0
; j) k=0;
while
(k//k為頂點數
}void
printmgraph
(mgraph g)}}
void
minispantree_prim
(mgraph g, vertextype ch)
closedge[maxlen]
; k =
locate
(g, ch)
;//這裡以ch為起始點,k是ch在圖中的下標
system
("cls");
printf
("\n以%c為起始頂點的prim最小生成樹的邊集為:\n"
,ch)
;printf
("\n head\t tail\t weight\n");
printf
("-------------------------\n");
for(j=
0; j(j!=k)
//無向圖的鄰接矩陣對角線為0
closedge[k]
.adjvex = ch;
closedge[k]
.lowcost =0;
//表示這個頂點已經放入生成樹中(這裡為ch,因為以它為起始點),將其在lowcost上相應位置為0,
for(i=
1; i) j++;}
printf
(" %c\t %c\t %d\n"
, closedge[k]
.adjvex, g.vexs[k]
, closedge[k]
.lowcost)
;printf
("-------------------------\n");
closedge[k]
.lowcost =0;
for(j=
0; j(closedge[j]
.lowcost !=
0&& closedge[j]
.lowcost > g.arc[k]
[j])
//判斷lowcost中的權值與新加入生成樹的頂點的邊的大小,這樣得出生成樹 }}
void
createegraph
(egraph &g)
i=0;while
(i//k為頂點數
system
("cls");
}void
printegraph
(egraph g)
}void
sort
(egraph &g)}}
void
minispantree_kruscal
(egraph &g)
j++;}
free
(vset)
;printf
("\nkruscal最小生成樹中的邊集為:\n");
printf
(" i\thead\ttail\tweight\n");
printf
("-------------------------------\n");
for(j=
0;j1;j++)}
/* 求最小生成樹的kruskal演算法 */
void
menu()
//menu
intmain()
}return0;
}
最小生成樹(普里姆演算法 克魯斯卡爾演算法)
演算法 給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.求最小生成樹的演算法 1 克魯斯卡爾演算法 圖的存貯結構採用邊集陣列,且權值相等的邊在陣列中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間.2 普里姆演算法 圖的存貯結構採用鄰接矩...
克魯斯卡爾演算法
測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n 村莊數目m 100 隨後的 n 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本 也是正整數 為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。對每個測試用例,在...
克魯斯卡爾演算法
設n v,是連通網 1 令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖t v,圖中每個頂點自成乙個連通分量 2 在e中選擇代價最小的邊,若該邊依附的頂點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊 3 反覆執行第2 步,直至t中所有頂點都在同一連通分量上為...