贝西已经搬到了一个小农场,有时喜欢回去看望她最好的朋友之一。
她不想太快到达她的老家,因为她喜欢沿途的风景。
她决定走第二短的路而不是最短的路。
她知道一定有一些次要的最短路径。
乡村由R(1≤R≤100,000)双向道路组成,每条道路连接N(1≤N≤5,000)交叉口中的两个交叉口,方便地编号为1.N。贝西从交叉口1开始,她的朋友(目的地)在交叉口N。
第二最短路径可以与任何最短路径共享道路,并且它可以回溯,即,使用相同的道路或交叉点不止一次。
第二最短路径是其长度长于最短路径的最短路径(即,如果存在两个或更多个最短路径,则第二最短路径是其长度比那些路径长但不长于任何其他路径的路径)。
Input
Line 1: Two space-separated integers: N and R
Lines 2… R+1: Each line contains three space-separated integers: A, B, and D that describe a road that connects intersections A and B and has length D (1 ≤ D ≤ 5000)
Output
Line 1: The length of the second shortest path between node 1 and node N
Sample Input
4 4
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
450
Hint
Two routes: 1 -> 2 -> 4 (length 100+200=300) and 1 -> 2 -> 3 -> 4 (length 100+250+100=450)
严格次短路,采用修改过的最短路算法,添加次短路数组记录来直接获取次短路。类迪杰斯特拉
避免了依次列举每条边的复杂做法。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <string>
using namespace std;
//for(i=1;i<n;i++)
//scanf("%d",&n);
//printf("\n",);
struct inf
{
int to,cost;
}temp;
vector<inf>mapp[9120];
int ans[9120];
int realans[9120];
bool flag[9120];
int main()
{
int i,j,k,n,m,d,num;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<m;i++)
{
scanf("%d%d%d",&j,&k,&d);
temp.to=k;
temp.cost=d;
mapp[j].push_back(temp);
temp.to=j;
mapp[k].push_back(temp);
}
for(i=1;i<=n;i++)
ans[i]=0x3f3f3f3f;
for(i=1;i<=n;i++)
realans[i]=0x3f3f3f3f;
ans[1]=0;
queue<int>q;
q.push(1);
//flag[1]=1;
int te;
while(q.empty()!=true)
{
te=q.front();
q.pop();
//flag[te]=0;
for(i=0;i<mapp[te].size();i++)
{
if(ans[mapp[te][i].to]>ans[te]+mapp[te][i].cost)
{
ans[mapp[te][i].to]=ans[te]+mapp[te][i].cost;
//if(flag[mapp[te][i].to]==0)
{
q.push(mapp[te][i].to);//flag[mapp[te][i].to]=1;
}
}
if(realans[mapp[te][i].to]>ans[te]+mapp[te][i].cost&&ans[te]+mapp[te][i].cost!=ans[mapp[te][i].to])
{
realans[mapp[te][i].to]=ans[te]+mapp[te][i].cost;
//if(flag[mapp[te][i].to]==0)
{
q.push(mapp[te][i].to);//flag[mapp[te][i].to]=1;
}
}
if(realans[mapp[te][i].to]>realans[te]+mapp[te][i].cost&&realans[te]+mapp[te][i].cost!=ans[mapp[te][i].to])
{
realans[mapp[te][i].to]=realans[te]+mapp[te][i].cost;
//if(flag[mapp[te][i].to]==0)
{
q.push(mapp[te][i].to);//flag[mapp[te][i].to]=1;
}
}
}
}
printf("%d\n",realans[n]);
for(i=0;i<=n;i++)
mapp[i].clear();
memset(flag,0,sizeof(flag));
}
//memset(num,0,sizeof(num));
return 0;
}