带权图 GraphW
最小生成树(MSTW)
有权图的最小生成树是用优先级队列来实现的,优先级队列 可以基于堆来实现,也可以基于数组实现。
方法
- 从一个顶点开始,放到树的集合中,循环执行下面步骤
- 找到从最新的顶点到其他顶点的的所有边,这些顶点不在树的集合中,将这些边放到优先级队列
- 找到权值最小的边,把它和它所到达的顶点都放到树的集合中
顶点分类
- 已经被连接的顶点,它们是最小生成树的顶点
- 还没有被链接的顶点,但是知道把他们连接到至少一个已知顶点的权重,
这些叫做边缘顶点 - 还不知道任何信息的顶点
边的剪除
在算法中,要确保优先级队列不能有连接在已在树中的的顶点的边,每次向树中增加顶点后,都要遍历优先级队列查找并删除这样的边,也就是优先级队列中应该只包含一条到达某个第二类顶点的边
putInPQ
:保证优先级队列中应该只包含一条到达某个特定目标顶点的边
- 调用
find()
方法,寻找优先队列中是否存在可以到达指定节点的边,
如果存在,返回其所在队列的位置,不存在则返回-1
- 存在:如果
oldDist
大于newDist
,则在队列中删除removeN
前者所在tempEdge
,插入insert
后者theEdge
;
如果oldDist
小于或等于newDist
,则队列不作更改 - 不存在:直接
insert
插入Edge
算法具体实现
- 当前顶点
currentVert
放在树中 - 连接这个顶点的边放到优先级队列中
putInPQ
,但是只要一下任意一个条件满足,这条边就不可以放入队列中
- 源点和终点相同
- 终点在树中
- 源点和终点之间没有边(邻接矩阵中对应的值为
INFINITY
)
3.将权值最小的边从优先级队列中删除removeMin
,把这条边和该边的终点加入树,并显示源点和终点。
代码片段
public void mstw(){
currentVert=0;