從圖中任意取出乙個頂點,把他當作一棵樹,然後從這棵樹相接的邊中選取一條最短(權值最小)的邊,並將這條邊及其所連線的頂點也併入這棵樹中,此時得到一顆有兩個頂點的樹。然後在這棵樹中相連的頂點中選取最短的邊,並將圖中的所有頂點併入樹中為止,此時得到的樹就是最小生成樹。
流程如圖:
/*普利姆演算法*/
void prim(graph g, int v0, int &sum)
vset[v0] = 1;//將v0併入樹中
sum = 0;//sum清零用來累計樹的權值
for (i = 0; i < g.vetexs; ++i)
vset[j] = 1;
v = k;
sum += min;//記錄最小生成樹的總權值,也可以換成其他操作
/*下面這個迴圈一剛併入的頂點v為媒介更新候選邊*/
for (j = 0; j < g.vetexs; ++j)
if (vset[j] == 0 && g.arcs[v][j] < lowcost[j])
lowcost[j] = g.arcs[v][j];
}}
基本思想:(1)構造乙個只含n個頂點,邊集為空的子圖。若將圖中各個頂點看成一棵樹的根節點,則它是乙個含有n棵樹的森林。(2)從網的邊集 e 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖。也就是說,將這兩個頂點分別所在的兩棵樹合成一棵樹;反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之(3)依次類推,直至森林中只有一棵樹,也即子圖中含有 n-1條邊為止。大白話:(1)將圖中的所有邊都去掉。(2)將邊按權值從小到大的順序新增到圖中,保證新增的過程中不會形成環(3)重複上一步直到連線所有頂點,此時就生成了最小生成樹。這是一種貪心策略。
typedef struct road;
road road[max_num];
int v[max_num];//定義並查集陣列
int getroot(int a)
void kruskal(graph g, int &sum, road *road)
}}
最小代價生成樹 Kruskal演算法
1.圖的儲存結構 採用邊集陣列儲存圖。2.定義parent i 陣列,輔助完成連通分量的處理。陣列分量的值表示頂點i的雙親結點 初值為 1 當一條邊 u,v 的兩個頂點的根結點不同時,這兩個結點屬於不同的連通分量 利用parent陣列查詢一棵樹的根節點。當乙個結點n的parent 1,樹的根節點即為...
實驗六 最小代價生成樹
一 實驗名稱 最小代價生成樹 二 實驗目的 1.掌握貪心演算法解決問題的思想和一般過程,2.學會使用普里姆演算法解決實際問題。三 實驗內容 完善下列程式,並回答問題。1 include2 define g node num 6 結點個數 3 define infty 65535 4 template...
最小代價樹
題目 描述以下方法稱為最小代價的字母樹 給定一正整數序列,例如 4,1,2,3,在不改變量的位置的條件下把它們相加,並且用括號來標記每一次加法所得到的和。例如 4 1 2 3 5 5 10。除去原數不4,1,2,3之外,其餘都為中間結果,如5,5,10,將中間結果相加,得到 5 5 10 20,那麼...