關於最小生成樹的概念,請參考前一篇文章: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 : 14~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 有鄰接表 用於稀疏矩陣 和鄰接矩陣 用於稠密矩陣 下面我給的例項適合用稀疏矩陣。聽了大概...