次短路小结(Dijkstra)
第一篇博客,不好请见谅
求1到n的次短路
练习洛谷2865
有两种方法
1. 两遍dij,起点分别是1和n,用dis1和dis2表示。然后遍历每一条边,temp=dis1[u]+dis2[v]+这条边权,if(temp>dis1[n]&&temp<ans) ans=temp,这样就能找出ans了
代码
#include<cstdio>
#include<vector>
#include<queue>
#define ri register int
#define maxn 5005
#define maxm 200005
#define inf 0x7fffffff
int from[maxm],to[maxm],w[maxm],next[maxm];
int head[maxn],vis[maxn],dis1[maxn],dis2[maxn];
int n,r,s,cnt,b,temp;
struct Node{
int x,y;
Node(int a,int b){
x=a,y=b;
}
};
bool operator < (Node a,Node b){
return a.y>b.y;
}
inline int read(){
ri f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void add_edge(int u,int v,int wi){
to[++cnt]=v;
from[cnt