dijkstra双层图的一种解决方法

本文介绍了一种基于堆优化的Dijkstra算法解决双层图问题的方法。在双层图中,通过扩展距离数组和边的属性,实现从起点到各点在不同层的最短路径计算。适用于图论与算法优化的学习者。

dijkstra双层图的一种解决方法

Original Ideas and similar code from here

  • 基础建立在堆优化dijkstra(保留vis数组)之上
  • 在单层图的情况下,我们可以在dijkstra()函数之外建立一个数组d,d[x]用于保存从出发点到x点的距离大小
  • 在dijkstra求距离之前置出发点的距离为0
  • 在双层图的情况下需要做出的改变:
  1. 存距离大小时仍使用数组d,但要开成d [点的个数n] [第二层图的边数]
  2. 存边时对两层图在存边的属性的结构体中增加一个flag(mark/etc.)变量对两层图进行区分
  3. 建图时在存点的属性的结构体中增加一个k变量用于记录第二层图走过的边数
  4. 求最小距离时对队列弹出的结构体t存储的距离不符合d[对应的点][对应的第二层走过的边数]时直接continue
  5. 求最小距离时存入队列的结构体tt(以把存点的属性的结构体传入为例):
    …如果当前边是第二层图,tt.k = t.k + 1; 否则 tt.k = t. k
    …tt存储的距离 = 当前d[对应的点][对应的第二层走过的边数]

(以下内容没有经过实践检验,慎用)

  • x层图则把d开成x维数组,需要的标记变量也在结构体中添上
  • (但是 空间复杂度n*m^k,(n对应点数,m为从第二层开始每层图的可用边数,k为图的层数-1),图的层数多而且边又多的情况下空间应该会炸的非常惨)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值