一、實驗名稱:最小代價生成樹
二、實驗目的:
1.掌握貪心演算法解決問題的思想和一般過程,
2.學會使用普里姆演算法解決實際問題。
三、實驗內容
完善下列程式,並回答問題。
1 #include2view code#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 }
補充後的程式:
1 #include2view code#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 }
程式問題
分析演算法,說明演算法中涉及到的變數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,那麼...