更新时变为3种情况:
1.最短路更新最短路;
2.最短路不能更新最短路但能更新次短路;
3.次短路更新次短路。
思考一下,就显然了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;
#define MAXN (100100)
int V, E, tot = 0;
int first[MAXN], nxt[MAXN<<1], dis1[MAXN], dis2[MAXN];
bool used[MAXN];
struct edge{
int from, to, cost;
}es[MAXN<<1];
void build(int ff, int tt, int dd)
{
es[++tot] = (edge){ff,tt,dd};
nxt[tot] = first[ff];
first[ff] = tot;
}
#define INF (1e9)
queue <int> q;
void sub_spfa(int s)
{
fill(dis1+1,dis1+V+1,INF); fill(dis2+1,dis2+V+1,INF);
dis1[s] = 0;
q.push(s);
used[s] = 1;
while(q.size())
{
int x = q.front();
q.pop();
used[x] = 0;
for(int i = first[x]; i != -1; i = nxt[i])
{
int v = es[i].to;
if(dis1[v] > dis1[x] + es[i].cost)
{
dis2[v] = dis1[v];
dis1[v] = dis1[x] + es[i].cost;
if(!used[v])
{
q.push(v);
used[v] = 1;
}
}
else if((dis1[v]<dis1[x]+es[i].cost) && (dis2[v]>dis1[x]+es[i].cost))
{
dis2[v] = dis1[x] + es[i].cost;
if(!used[v])
{
q.push(v);
used[v] = 1;
}
}
else if(dis2[v] > dis2[x] + es[i].cost)
{
dis2[v] = dis2[x] + es[i].cost;
if(!used[v])
{
q.push(v);
used[v] = 1;
}
}
}
}
}
int main()
{
cin >> V >> E;
memset(first,-1,sizeof(first));
for(int i = 1; i <= E; ++ i)
{
int f,t,d;
scanf("%d%d%d", &f, &t, &d);
build(f,t,d);
}
sub_spfa(1);
if(dis2[V] < INF) cout << dis2[V] << '\n';
else puts("-1");
return 0;
}