【模板】次短路

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=5000+10;
const int maxm=200000+10;
const int inf=0x3f3f3f3f;
int d[maxn],d1[maxn],head[maxn],inq[maxn],q[maxn];
int tol=0;
int n,r;
 
struct Edge
{
    int from,to,w,next;
}edge[maxm];
 
void init()
{
    memset(head,-1,sizeof(head));
    tol=0;
}
 
void addedge(int u,int v,int w)
{
    edge[tol].from=u,edge[tol].to=v,edge[tol].w=w,edge[tol].next=head[u],head[u]=tol++;
    edge[tol].from=v,edge[tol].to=u,edge[tol].w=w,edge[tol].next=head[v],head[v]=tol++;
}
 
void spfa(int s,int *d)
{
    memset(inq,0,sizeof(inq));
    memset(q,0,sizeof(q));
    for(int i=1;i<=n;i++) d[i]=inf;
    d[s]=0,inq[s]=1;
    int front=0,rear=0;
    q[rear++]=s;
    while(front!=rear)
    {
        int u=q[front++];
        inq[u]=0;
        if(front>=maxn) front=0;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to,w=edge[i].w;
            if(d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                if(inq[v]) continue;
                inq[v]=1;
                q[rear++]=v;
                if(rear>=maxn) rear=0;
            }
        }
    }
    
}
 
int main()
{
    while(~scanf("%d%d",&n,&r))
    {
        init();
        while(r--)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
        }
        spfa(1,d);
        spfa(n,d1);
        int ans=d[n],res=inf;
        for(int i=0;i<tol;i++)
        {
            int u=edge[i].from,v=edge[i].to,w=edge[i].w;
            if(d[u]+d1[v]+w>ans)
            res=min(res,d[u]+d1[v]+w);
        }
        printf("%d\n",res);
    }
}

 

posted @ 2019-04-21 21:22  Dorom  阅读(146)  评论(0)    收藏  举报