貪心演算法 最小生成樹 Prim演算法

2021-06-08 08:43:00 字數 1438 閱讀 9216

乙個無向帶權圖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個子集合。每一步操作,都會將兩個子集合融合成乙個,進而減少乙個子集合。...