数据结构[4] -- 带权图

带权图 GraphW

最小生成树(MSTW)

有权图的最小生成树是用优先级队列来实现的,优先级队列 可以基于来实现,也可以基于数组实现。

方法

  1. 从一个顶点开始,放到树的集合中,循环执行下面步骤
  2. 找到从最新的顶点到其他顶点的的所有边,这些顶点不在树的集合中,将这些边放到优先级队列
  3. 找到权值最小的边,把它和它所到达的顶点都放到树的集合中

顶点分类

  • 已经被连接的顶点,它们是最小生成树的顶点
  • 还没有被链接的顶点,但是知道把他们连接到至少一个已知顶点的权重,
    这些叫做边缘顶点
  • 还不知道任何信息的顶点

边的剪除

在算法中,要确保优先级队列不能有连接在已在树中的的顶点的边,每次向树中增加顶点后,都要遍历优先级队列查找并删除这样的边,也就是优先级队列中应该只包含一条到达某个第二类顶点的边

putInPQ:保证优先级队列中应该只包含一条到达某个特定目标顶点的边

  1. 调用find()方法,寻找优先队列中是否存在可以到达指定节点的边,
    如果存在,返回其所在队列的位置,不存在则返回-1
  2. 存在:如果oldDist大于newDist,则在队列中删除removeN前者所在tempEdge,插入insert后者theEdge
    如果oldDist小于或等于newDist,则队列不作更改
  3. 不存在:直接insert插入Edge

算法具体实现

  1. 当前顶点currentVert放在树中
  2. 连接这个顶点的边放到优先级队列中putInPQ,但是只要一下任意一个条件满足,这条边就不可以放入队列中
    • 源点和终点相同
    • 终点在树中
    • 源点和终点之间没有边(邻接矩阵中对应的值为INFINITY

3.将权值最小的边从优先级队列中删除removeMin,把这条边和该边的终点加入树,并显示源点和终点。

代码片段

public void mstw(){
        currentVert=0;

        
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值