Roadblocks
题目描述
贝茜把家搬到了一个小农场,但她常常回到 FJ 的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。
贝茜所在的乡村有 \(R(1\leq R\leq10^5)\)条双向道路,每条路都连接了所有的\(N(1\leq N\leq 5000)\) 个农场中的某两个。贝茜居住在农场 \(1\),她的朋友们居住在农场\(N\) (即贝茜每次旅行的目的地)。
贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且一条路可以重复走多次。当然第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。
输入描述
输入文件的第\(1\) 行为两个整数,\(N\) 和 \(R\),用空格隔开;
第\(2....R+1\) 行:每行包含三个用空格隔开的整数 \(A\)、\(B\) 和\(D\) ,表示存在一条长度为\(D(1 \leq D \leq 5000)\) 的路连接农场 \(A\)和农场\(B\) 。
输出格式
输出仅一个整数,表示从农场\(1\) 到农场\(N\) 的第二短路的长度。
样例输入
4 4
1 2 100
2 4 200
2 3 250
3 4 100
样例输出
450
思路
用Dijkstra计算最短路径,因为要求求出严格次短路径,所用用两个数组记录,一个记录最短路径一个记录此段路经,跑Dijkstra即可
/****************************************************
/@Author: Kirito
/@TIME: 2020-04-30
/@FILENAME: Roadblocks.cpp
/@REMARK:
/****************************************************/
#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define CSE(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define Abs(x) (x>=0?x:(-x))
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;
const int maxn=211111;
//graph
int first[maxn],nxt[maxn],u[maxn],v[maxn],w[maxn];
int n,m,cnt;
//spfa-box
int dis[maxn],book[maxn],ans[maxn];
//邻接表
void add(int x,int y,int d){
cnt++;
u[cnt]=x;v[cnt]=y;w[cnt]=d;
nxt[cnt]=first[u[cnt]];first[u[cnt]]=cnt;
return;
}
//Dijkstra
void Dijkstra(){
CSE(dis,INF);CSE(book,0);CSE(ans,INF);
priority_queue<pii,vector<pii>,greater<pii>> box;
box.push(make_pair(0,1));dis[1]=0;
while(!box.empty()){
int x=box.top().second,base=box.top().first;box.pop();
for(int i=first[x];i!=-1;i=nxt[i]){
int y=v[i];
int d=w[i]+base;
if(dis[y]>d){
ans[y]=dis[y];
dis[y]=d;
box.push(make_pair(dis[y],y));
}
else if(dis[y]==d) continue;
else if(ans[y]>d){
ans[y]=d;
box.push(make_pair(ans[y],y));
}
}
}
return ;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
FAST;
CSE(first,-1);CSE(nxt,-1);CSE(w,INF);
cin>>n>>m;
for(int i=0;i<m;i++){
int x,y,d;
cin>>x>>y>>d;
add(x,y,d);add(y,x,d);
}
Dijkstra();
cout<<ans[n]<<endl;
return 0;
}