数据结构 迪杰斯特拉算法提高:多路径多权重解决方式

迪杰斯特拉算法基础篇见:https://blog.csdn.net/alex1997222/article/details/87113058

有的时候在图中,1个点到另一个点的最短路径不止一条,这时后会有除去距离外其他权重用于判断(比如花费,物资收集等)

这样的题型一般分为以下三种情况:

(1)给每条边再增加一个边权(比如花费),然后要求在多条最短路径上选择花费最少的那条

一般解决方式是,在算法运行时,如果一个结点的距离小于上一个结点的距离+边权,那么就照常赋值,但如果该节点距离==上一个结点的距离+边权,那么就比较花费

for (int v = 0; v < n; ++v) {
			if (!Vis[v] && G[u][v] != INF) {
                if(G[u][v] + d[u] < d[v]){
				    d[v] = G[u][v] + d[u];  //优化结点
                    c[v] = cost[u][v] + c[u];
                 }
				else if(G[u][v] + d[u] == d[v] &&  c[v] > cost[u][v] + c[u]){
                    c[v] = cost[u][v] + c[u];
                }
			}
		}

(2)给每个结点增加一个点权,要求在多条最短路上选择点权和最大的那条

思路与上个案例一致,我们用一个数组保存各个点的点权

for (int v = 0; v < n; ++v) {
			if (!Vis[v] && G[u][v] != INF) {
                if(G[u][v] + d[u] < d[v]){
				    d[v] = G[u][v] + d[u];  //优化结点
                    w[v] = weight[v] + w[u];
                 }
				else if(G[u][v] + d[u] == d[v] &&  w[v] < weight[v] + w[u]){
                    w[v] = weight[v] + w[u];
                }
			}
		}
 

 (3)求最短路径的条数

一样的思路:赋值更优方案时,把上一个结点的路径条数赋到这个结点中

for (int v = 0; v < n; ++v) {
			if (!Vis[v] && G[u][v] != INF) {
                if(G[u][v] + d[u] < d[v]){
				    d[v] = G[u][v] + d[u];  //优化结点
                    num[v] = num[u];
                 }
				else if(G[u][v] + d[u] == d[v]){
                    num[v] += num[u];
                }
			}
		}

上述权重数组c[x],w[x],num[x],要和d[x]一样,起点位置要进行初始化

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值