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

2021-07-27 05:27:40 字數 2003 閱讀 3855

關於最小生成樹的概念,請參考前一篇文章:prim演算法。

kruskal演算法:

不停地迴圈,每一次都尋找兩個頂點,這兩個頂點不在同乙個真子集裡,且邊上的權值最小。

把找到的這兩個頂點聯合起來。

初始時,每個頂點各自屬於自己的子集合,共n個子集合。

每一步操作,都會將兩個子集合融合成乙個,進而減少乙個子集合。

結束時,所有的頂點都在同乙個子集合裡,這個子集合就是最小生成樹。

例子:

演算法過程為:

**實現:

public

class

kruskal

// 初始化最小堆

for (int i = 0; i < n; i++)

} }

edge edge;

int count = n, v1, v2, num;

while ((count > 1) && (edge = edges.removemin()) != null)

} system.out.println((v1+1) + "~" + (v2+1) + " : " + edge.len);

} }

private

static

boolean

isreachable(int e, int v1, int v2)

public

static

void

main(string args) , ,

, ,

, };

kruskal(e);

} } class edge implements comparable

@override

public

intcompareto(edge o)

@override

public string tostring()

}

/**

* 0

* / \

* 1 2

* / \

* 3 4

* */

public

class minheap

public

minheap(int capacity)

public boolean add(t val) else

i = p;

}return

true;

}public t remove(int index)

}return val;

}public t removemin()

public t get(int index)

private

static

intleftindex(int index)

private

static

intrightindex(int index)

private

static

intparentindex(int i)

private boolean isleaf(int index)

private

void

swap(object data, int i1, int i2)

}

執行結果:

1~3 : 1

4~6 : 2

2~5 : 3

3~6 : 4

2~3 : 5

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

乙個無向帶權圖g v,e 其中n個頂點vertex,以及連線各個頂點之間的邊edge,可能有些頂點之間沒有邊,每條邊上的權值都是非負值。生成樹 g的乙個子圖,包含了所有的vertex,和部分的edge。最小生成樹 所有的生成樹中,各條edge上的權值總和最小的乙個。例子 設計通訊網路時,各個城市之間...

最小生成樹演算法 Prim演算法和Kruskal演算法

prim演算法理解,可以看這篇文章 其實就是每次從當前樹中外選取乙個離樹最近且不構成環的點,同時sum記錄權值,然後把這個點加入樹中,直到所有節點都被訪問過,最小生成樹生成成功,輸出最小生成樹的權值和。下面是prim演算法的板子,和最短路有點相似,也稱為 加點法 最小生成樹prim演算法 inclu...

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

滿足貪心演算法的條件是都滿足動態規劃的,只是貪心演算法的條件更強,不僅前乙個步驟的解可以用到後一步,而且前一步的解是子問題的最優解,最後能夠得到全域性的最優解。prim演算法是乙個求最小生成樹的演算法。表示圖g 有鄰接表 用於稀疏矩陣 和鄰接矩陣 用於稠密矩陣 下面我給的例項適合用稀疏矩陣。聽了大概...