應用場景
修路問題的本質就是最小生成樹問題,簡稱mst
給定乙個帶權的無向連通圖,如何選取一顆生成樹,使樹上所有邊上權的總和最小,這叫最小生成樹
n個頂點,一定有n-1條邊
包含全部頂點
普里姆演算法
設g=(v, e)是連通網,t=(u, d)是最小生成樹,v,u是頂點集合,e,d是邊的集合
若從頂點u開始生成最小生成樹,則從集合v中取出頂點u放入集合中,標記頂點v的visited[u] = 1
重複步驟2,直到u與v相等,即所有頂點都被標記訪問過,此時d中有n-1條邊
**實現
public
class
primalgorithm
;int verxs = data.length;
int[
] weight =,,
,,,,
}; mgraph graph =
newmgraph
(verxs)
; mintree mintree =
newmintree()
; mintree.
creategraph
(graph, verxs, data, weight)
; mintree.
showgraph
(graph);
mintree.
prim
(graph,3)
;}}class
mintree}}
/** * 編寫prim演算法
* @param graph 圖
* @param v 開始的頂點
*/public
void
prim
(mgraph graph,
int v)}}
//找到一條邊最小的
system.out.
println
("邊<"
+ graph.data[h1]
+","
+ graph.data[h2]
+"> 權值:"
+ minweight)
; visited[h2]=1
; minweight =
10000;}
}public
void
showgraph
(mgraph graph)
system.out.
println()
;}}}
class
mgraph
}
資料結構與演算法之普里姆演算法
思想 選取圖中任意乙個頂點,把它看成一棵樹,並在與此樹相接的邊中選取乙個權值最小的邊,並將與這條邊相接的另乙個頂點也納入樹中,得到了一顆有兩個頂點的樹,以此類推,知道訪問完圖中所有的頂點並納入樹中為止 普里姆演算法構造最小生成樹的過程中 需要構造兩個陣列vset 和lowcost vset i 1表...
常用資料結構之普里姆演算法
在圖中,尋找一棵最小代價的生成樹尤為重要。現在有普里姆演算法。基於鄰接矩陣來實現。void prim mgraph g,int v0,int sum int lowcost maxsize vset maxsize v int k int min int v v0 for i 0 i 大致思路解析 ...
普里姆演算法
include include include include using namespace std define max name 5 define max vertex num 20 權的上限值 typedef char vertex max name 頂點名字串 typedef int ad...