51nod 2650 最短缩减路径 (拆点最短路)

本文介绍了一种解决特殊最短路径问题的方法——通过构建双层图并利用拆点思想来确保路径缩短仅使用一次且达到最优解。该方法不仅适用于最短路径问题,还能应用于并查集等更广泛的领域。

问题描述:

题目传送门


解题思路:

我们一般会想到先在图上跑一遍最短路,然后在最短路径中找一条最长的边进行缩短。但是很容易可以发现,这种做法是很假的,因为缩短路径可能会使某条非最短路变成最短路。

此时我们需要考虑一种清奇的思路。
构建两张一模一样的图,其中上图 G G G 表示还未使用路径缩短的图,下图 G ′ G' G 表示已经使用了路径缩短的图,而上下图连接的单向变表示被路径缩短的边。
如图:

在这里插入图片描述
这样一来,由于在路径中必然需要使用一次路径缩短,因此我们必然要从上图的起点到达下图的终点,因此我们可以在这种双层图中跑一遍从 S S S T ′ T' T 的最短路,即为问题的解。
通过这种把情况拆开求解的图,我们既保证了路径缩短的使用,也保证了他仅仅只用一次以及答案的最优性。

此解法运用了拆点的思想,把每一条边的边权拆成 w w w w / 2 w/2 w/2 的两种状态进行求解,在很多问题甚至扩展域并查集都有用到。


CODE:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值