普里姆演算法與克魯斯卡爾演算法之最小生成樹

2021-09-28 06:31:31 字數 2361 閱讀 5180

#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中所有頂點都在同一連通分量上為...