乙個無向帶權圖g=(v,e),其中n個頂點vertex,以及連線各個頂點之間的邊edge,可能有些頂點之間沒有邊,每條邊上的權值都是非負值。
生成樹:
g的乙個子圖,包含了所有的vertex,和部分的edge。
最小生成樹:
所有的生成樹中,各條edge上的權值總和最小的乙個。
例子:設計通訊網路時,各個城市之間鋪設線路,最經濟的方案。
最小生成樹性質:
g=(v,e),
s是v的真子集,
如果u在s中,v在v-s中,且(u,v)是圖的一條邊,稱之為特殊邊,且(u,v)是所有特殊邊中最短的,
那麼,(u,v)這條邊一定在最小生成樹中。
prim演算法:
任意指定乙個頂點作為起始點,放在s中。
每一步將最短的特殊邊放入s中,需要n-1步,即可把所有的其他的點放入s中。演算法結束。
對於這個圖,prim演算法的過程為:
**實現如下:
/**
* 最小生成樹 minimum spanning tree
* @author xuefeng
* */
public class mst
int min = -1, minv = -1;
for (int i = 1; i < n; i++)
}if (minv == -1)
continue;
s[minv] = true;
// s中多了個點,需要改變s離外面的點的最短距離
for (int j = 1; j < n; j++)
}// 輸出測試結果
for (int j = 0; j < n; j++)
}system.out.println();
} }private static boolean isreachable(int e, int v1, int v2)
public static void main(string args) , ,
, ,, };
prim(e);
}}
輸出為:
1 3
1 3 6
1 3 4 6
1 2 3 4 6
1 2 3 4 5 6
可由prev陣列構造出最小生成樹。
演算法複雜度為o(n^2)
貪心演算法之Prim最小生成樹
滿足貪心演算法的條件是都滿足動態規劃的,只是貪心演算法的條件更強,不僅前乙個步驟的解可以用到後一步,而且前一步的解是子問題的最優解,最後能夠得到全域性的最優解。prim演算法是乙個求最小生成樹的演算法。表示圖g 有鄰接表 用於稀疏矩陣 和鄰接矩陣 用於稠密矩陣 下面我給的例項適合用稀疏矩陣。聽了大概...
貪心演算法之最小生成樹(Prim)
最小生成樹 prim 網路的生成樹中的邊帶權值,將生成樹各邊的權值加起來稱為生成樹的權,權值最小的生成樹稱為為最小生成樹。設g v,e 是連通帶權圖,v prim演算法基本思想 首先置s 然後,只要s是v的真子集,就進行如下貪心選擇 選取滿足條件i s,j v s,且c i j 最小的邊,將頂點j新...
貪心演算法 最小生成樹 Kruskal演算法
關於最小生成樹的概念,請參考前一篇文章 prim演算法。kruskal演算法 不停地迴圈,每一次都尋找兩個頂點,這兩個頂點不在同乙個真子集裡,且邊上的權值最小。把找到的這兩個頂點聯合起來。初始時,每個頂點各自屬於自己的子集合,共n個子集合。每一步操作,都會將兩個子集合融合成乙個,進而減少乙個子集合。...