不太会dijkstra..所以我用的是spfa。
维护最短路和次短路即可
#include<cstdio>
using namespace std;
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int head[100001];
struct map
{
int f;
int s,t;
int next;
}a[400001];
int b[5001];
int edge;
int p;
int q[400001],d[400001];
inline void add(int s,int t,int f)
{
a[edge].next=head[s];
head[s]=edge;
a[edge].s=s;
a[edge].t=t;
a[edge].f=f;
}
int dis[5001],dis2[5001];
bool v[5001];
inline void spfa()
{
memset(dis,127/3,sizeof(dis));
memset(dis2,127/3,sizeof(dis2));
memset(v,false,sizeof(v));
int l=1,r=0;
r++;
q[r]=1;
dis[1]=0;
//dis2[1]=0;
v[1]=true;
while(l<=r)
{
int d=q[l];
v[d]=false;
int i;
for(i=head[d];i!=0;i=a[i].next)
{
int t=a[i].t;
if(dis[d]+a[i].f<dis[t])
{
dis2[t]=min(dis[t],dis2[d]+a[i].f);
dis[t]=dis[d]+a[i].f;
if(!v[t])
{
r++;
q[r]=t;
v[t]=true;
}
}
else if(dis[d]+a[i].f==dis[t]&&dis2[d]+a[i].f<dis2[t])
{
dis2[t]=dis2[d]+a[i].f;
if(!v[t])
{
r++;
q[r]=t;
v[t]=true;
}
}
else if(dis[d]+a[i].f>dis[t]&&dis[d]+a[i].f<dis2[t])
{
dis2[t]=dis[d]+a[i].f;
if(!v[t])
{
r++;
q[r]=t;
v[t]=true;
}
}
}
l++;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int i;
int s,t,f;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&s,&t,&f);
edge++;
add(s,t,f);
edge++;
add(t,s,f);
}
spfa();
printf("%d\n",dis2[n]);
return 0;
}