方法一:
- 解法:通过正向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