题目描述
贝茜把家搬到了一个小农场,但她常常回到 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 41 2 1002 4 2002 3 2503 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;//graphint first[maxn],nxt[maxn],u[maxn],v[maxn],w[maxn];int n,m,cnt;//spfa-boxint 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;}//Dijkstravoid 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;}