最小生成樹之prim演算法概念與實現

2021-08-07 18:29:10 字數 1528 閱讀 5441

prim演算法是以頂點為視角的,每一步都會為生長中的樹新增一條邊。從初始頂點出發,然後找到頂點周圍最小的邊,然後移動到最小邊的另乙個端點,繼續找到頂點周圍最小的邊,直到得到最小生成樹。所以prim演算法的軌跡是一顆從初始頂點不斷蔓延的樹。

prim演算法的懶惰實現很簡單,將需要考察的頂點的邊放進乙個優先佇列中,並考察邊的頂點是否存在於最小生成樹中或者是否形成乙個環。如果都沒有,就將邊放進mst。

/**

* 懶惰實現普里姆斯演算法

*@author yuli

* */

public

class

lazyprimmst

}/**

* 將頂點放進mst中

*@param graph

*@param v

*/private

void

visit(edgeweightedgraph graph,int v)}}

/*** 獲取最小生成樹

*@return

*/public iterableedges()

/*** 獲取最小生成樹的權重

*@return

*/public

double

weight()

return weight;

}}

prim的懶惰演算法簡單方便,然是在把所有邊都放進優先佇列的做法不夠優雅,會消耗很多的記憶體和效能。所以出現了prim演算法的即時實現。

即時的prim演算法會逐個考察通向頂點的最優邊(權重最小)。因為貪心演算法的緣故,通向頂點最小的權值邊一定會組成乙個最小生成樹。

用乙個索引優先佇列維護通向最小生成樹的最近的頂點

將需要考察的頂點放進索引優先佇列中,考察通向這個頂點的最近的邊,如果有更新權值。考察完後將佇列中離樹最近的頂點出隊並加入到樹中。

/**

* 普里姆演算法即時實現

*@author yuli

* */

public

class

primmst

//把頂點0設定為最小,並考察

distto[0] = 0.0d;

pq.insert(0, 0.0d);

while(!pq.isempty())

}private

void

visit(edgeweightedgraph graph, int v)

//如果當前的邊權重比離端點最近的一條邊的權重輕,就替換掉

if(e.getweight() < distto[w])else}}

}/**

* 獲取最小生成樹

*@return

*/public iterableedges()

}return edges;

}/**

* 獲取最小生成樹的權重

*@return

*/public

double

weight()

return weight;

}}

最小生成樹之prim演算法

最小生成樹的演算法思想和介面介紹過的求單源的最短路徑演算法dijkstra演算法有很多相似地方,甚至很多 都是一樣。prim演算法要解決的主要問題是路徑的最短問題。假設平面上有很多點,各個點之間有很多的線連線起來,並且到達各個點的距離不相同,需要求出一條路徑,使得各個點都能被連線起來,並且他們的距離...

最小生成樹之prim演算法

普利姆演算法 prim algorithm 最小生成樹的概念 所謂最小生成樹,就是在乙個具有n個頂點的帶權連通圖g中,如果存在某個子圖g 其包含了圖g中的所有頂點和一部分邊,且不形成迴路,並且子圖g 的各邊權值之和最小,則稱g 為圖g的最小生成樹。普利姆演算法 prim algorithm 演算法描...

最小生成樹之prim演算法

mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...