次短路 两种做法 洛谷2865

本文介绍了两种解决次短路问题的方法。方法一是通过正反向求解最短距离,再枚举边寻找次短路径;方法二是利用Dijkstra算法同时求解最短路和次短路。洛谷测试数据的特殊性导致方法一存在无法通过的情况。
摘要由CSDN通过智能技术生成

方法一:

  • 解法:通过正向1—n求所有点到点1的距离,然后反响向求出所有点到点n的最短距离。然后我们来枚举每一条边,然后找出D=dis[0][u]+w(u,v)+dis[1][v]比最短路径大的中最小的一个就是次短路径。
  • 原因:因为次短路一定至少有一条边和最短路的不一样,我们通过枚举任意一条边,强制一条路一定从这里过。并且这条路的两个端点到1,N两个点的距离是保证最短的。因此当我们找到次短路跟最短路不一样的那条边的时候,我们就可以找到正确的结果。

这种方法,洛谷上有一个点过不去。洛谷的测试数据真是。。。走路都不好好走,1—2和2—1的路不一样,这就导致第一种方法过不去,具体自己看给的样例。

5 10
1 2 3355
2 3 1712
1 4 4892
1 5 1442
5 3 4768
3 1 4334
2 1 4365
3 1 2591
2 1 3817
3 2 4068

4326
#include <bits/stdc++.h>
using namespace std;
#define res register int 
#define inf 0x3f3f3f3f
const int maxn=5005;
int N,M,ans=1;
int head[maxn];
int dis[2][maxn];
int vis[maxn];
struct Node{
	int x,sum;
};
priority_queue<Node> q;
bool operator<(const Node a,const Node b){
	return a.sum>b.sum;
}
struct edge{
	int from,to,next,val;
}e[100005*2];

void add(in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值