给一手链接 https://www.luogu.com.cn/problem/P2865
这道题其实就是在维护最短路的时候维护一下次短路就okay了
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int M=200007,inf=1e9; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,m,cnt,first[M],d1[M],d2[M],vis[M]; struct node{int to,next,w;}e[2*M]; void ins(int x,int y,int w){e[++cnt]=(node){y,first[x],w}; first[x]=cnt;} queue<int>q; void spfa(){ for(int i=1;i<=n;i++) d1[i]=inf,d2[i]=inf; vis[1]=1; d1[1]=0; q.push(1); while(!q.empty()){ int x=q.front(); q.pop(); for(int i=first[x];i;i=e[i].next){ int now=e[i].to,f=0; if(d1[now]>d1[x]+e[i].w) f=1,d2[now]=min(d1[now],d2[x]+e[i].w),d1[now]=d1[x]+e[i].w; else if(d2[now]>d1[x]+e[i].w&&d1[now]<d1[x]+e[i].w) f=1,d2[now]=d1[x]+e[i].w; else if(d2[now]>d2[x]+e[i].w) f=1,d2[now]=d2[x]+e[i].w; if(f&&!vis[now]) q.push(now),vis[now]=1; } vis[x]=0; } } int main(){ int x,y,w; n=read(); m=read(); for(int i=1;i<=m;i++) x=read(),y=read(),w=read(),ins(x,y,w),ins(y,x,w); spfa(); printf("%d\n",d2[n]); return 0; }