實驗六 最小代價生成樹

2022-05-22 01:42:16 字數 3503 閱讀 2264

一、實驗名稱:最小代價生成樹

二、實驗目的:

1.掌握貪心演算法解決問題的思想和一般過程,

2.學會使用普里姆演算法解決實際問題。

三、實驗內容

完善下列程式,並回答問題。

1 #include2

#define g_node_num 6 //

結點個數

3#define infty 65535

4 template

5struct

enode

6 ;11 template

12class

graph

1321}22

void prim(int

s);23

void

putin(t x[g_node_num][g_node_num]);

24void

putout();

25protected:26

void prim(int k, int* nearest, t*lowcost);

27 enode**a;

28int

n; 29

};30

31 template

32void graph::putin(t x[g_node_num][g_node_num])43}

44}45}

46 template

47void graph::putout()57}

58 cout<

6061 template

62void graph::prim(int

s)63;66

67 template

68void graph::prim(int k, int* nearest, t*lowcost)

6972

73void

main(),

76 ,

77 ,

78 ,

79 ,

80 };

81int n =g_node_num;

82 g = new graph(n);

83 g->putin(data);

84 g->putout();

85 g->prim(0

);86 }

view code

補充後的程式:

1 #include2

#define g_node_num 6 //

結點個數

3#define infty 65535

4 template

5struct

enode

6 ;11 template

12class

graph

1321}22

void prim(int

s);23

void

putin(t x[g_node_num][g_node_num]);

24void

putout();

25protected:26

void prim(int k, int* nearest, t*lowcost);

27 enode**a;

28int

n; 29

};30

31 template

32void graph::putin(t x[g_node_num][g_node_num])43}

44}45}

46 template

47void graph::putout()57}

58 cout<

6061 template

62void graph::prim(int

s)63

70 cout<

71deletenearest;

72deletelowcost;

73};

7475 template

76void graph::prim(int k, int* nearest, t*lowcost)

7788

89//

源點k加入生成樹

90 lowcost[k]=0

;91 nearest[k]=k;

92 mark[k]=true

; 93

for(int i=1;i)

100}

101}

102103 t min=infty; //

求下一條最小權值的邊

104for(int j=0;j)

109}

110111 mark[k]=true; //

將節點k加到生成樹上

112}

113114

intmain(),

117 ,

118 ,

119 ,

120 ,

121 };

122int n =g_node_num;

123 g = new graph(n);

124 g->putin(data);

125 g->putout();

126 g->prim(0

);127 }

view code

程式問題

分析演算法,說明演算法中涉及到的變數k、nearest、lawcast、mark,分別表示的語義是什麼。

畫出prim演算法的流程圖。

執行課本第109頁圖6-10的普里姆演算法,生成的子樹是什麼? (程式自帶輸入部分)

在程式的適當位置,增加「cout<

若是8個節點的圖,如下所示,設計相應的輸入鄰接矩陣,通過普里姆演算法得出的最小生成子樹是什麼?

7.(選作)若是使用克魯斯卡爾演算法,課本第109頁圖6-10生成的最小子圖應該是什麼?

8.(選作)若是使用克魯斯卡爾演算法,(圖1)生成的最小子圖應該是什麼?

四、實驗總結

最小(代價)生成樹

從圖中任意取出乙個頂點,把他當作一棵樹,然後從這棵樹相接的邊中選取一條最短 權值最小 的邊,並將這條邊及其所連線的頂點也併入這棵樹中,此時得到一顆有兩個頂點的樹。然後在這棵樹中相連的頂點中選取最短的邊,並將圖中的所有頂點併入樹中為止,此時得到的樹就是最小生成樹。流程如圖 普利姆演算法 void pr...

最小代價生成樹 Kruskal演算法

1.圖的儲存結構 採用邊集陣列儲存圖。2.定義parent i 陣列,輔助完成連通分量的處理。陣列分量的值表示頂點i的雙親結點 初值為 1 當一條邊 u,v 的兩個頂點的根結點不同時,這兩個結點屬於不同的連通分量 利用parent陣列查詢一棵樹的根節點。當乙個結點n的parent 1,樹的根節點即為...

最小代價樹

題目 描述以下方法稱為最小代價的字母樹 給定一正整數序列,例如 4,1,2,3,在不改變量的位置的條件下把它們相加,並且用括號來標記每一次加法所得到的和。例如 4 1 2 3 5 5 10。除去原數不4,1,2,3之外,其餘都為中間結果,如5,5,10,將中間結果相加,得到 5 5 10 20,那麼...