首页 > 数据库技术 > 详细

洛谷P2865 [USACO06NOV]路障Roadblocks——次短路

时间:2019-12-07 10:04:18      阅读:81      评论:0      收藏:0      [点我收藏+]

给一手链接 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;
}
View Code

 

洛谷P2865 [USACO06NOV]路障Roadblocks——次短路

原文:https://www.cnblogs.com/yourinA/p/12000343.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!