dijkstra双层图的一种解决方法
Original Ideas and similar code from here
- 基础建立在堆优化dijkstra(保留vis数组)之上
- 在单层图的情况下,我们可以在dijkstra()函数之外建立一个数组d,d[x]用于保存从出发点到x点的距离大小
- 在dijkstra求距离之前置出发点的距离为0
- 在双层图的情况下需要做出的改变:
- 存距离大小时仍使用数组d,但要开成d [点的个数n] [第二层图的边数]
- 存边时对两层图在存边的属性的结构体中增加一个flag(mark/etc.)变量对两层图进行区分
- 建图时在存点的属性的结构体中增加一个k变量用于记录第二层图走过的边数
- 求最小距离时对队列弹出的结构体t存储的距离不符合d[对应的点][对应的第二层走过的边数]时直接continue
- 求最小距离时存入队列的结构体tt(以把存点的属性的结构体传入为例):
…如果当前边是第二层图,tt.k = t.k + 1; 否则 tt.k = t. k
…tt存储的距离 = 当前d[对应的点][对应的第二层走过的边数]
(以下内容没有经过实践检验,慎用)
- x层图则把d开成x维数组,需要的标记变量也在结构体中添上
- (但是 空间复杂度n*m^k,(n对应点数,m为从第二层开始每层图的可用边数,k为图的层数-1),图的层数多而且边又多的情况下空间应该会炸的非常惨)
本文介绍了一种基于堆优化的Dijkstra算法解决双层图问题的方法。在双层图中,通过扩展距离数组和边的属性,实现从起点到各点在不同层的最短路径计算。适用于图论与算法优化的学习者。
301

被折叠的 条评论
为什么被折叠?



