POJ_3255 Roadblocks(最短路)

题意:

找第二短的路。注意是严格的第二短,第二短一定是大于第一短的路径,并且路可以重复走。

思路:

首先注意到点的取值范围N(1-5000),要用邻接表去双向存储边表。

接下来考虑如何求第二短的路径,最好想的一个思路就是利用最短路的算法在维护最短距离的同时维护次短距离。另外设置一个dist1数组,当到达i点的最短路径更新时,将之前的最短距离存储到次短距离。在此注意设置dist[1] = 0时,dis1[1] = INF,到达起点的起始次短距离是INF。

另外一种方法是顺序求出最短路数组dist[],逆序求出最短路数组dist1[]。接下来遍历每一条边,对于某一边e(i,j),次短路一定等于dist[i]+e(i,j)+dist1[j],且不等于dist[N](最短路)。

因为对于边e(i,j)来说,假设该边不存在,则其他点的最短距离的性质是不变的,但是因为经过这条边(可能是重复经过),使得有了另外一条次短的路径。所以当我们在两边同时获得最短距离,同时枚举边时,就可以找到次短路径。

至于最短路的算法,SPFA或Dijkstra都可以选择,SPFA时间复杂度O(KE)(K<=2),Dijkstra时间复杂度O(E+VlgV),但是我的Dijkstra都TLE了。。。可能是测试数据的问题,但是SPFA感觉还是上手快一点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值