bzoj1726 [Usaco2006 Nov]Roadblocks第二短路(spfa)

来源:互联网 发布:mysql 5.7 for linux 编辑:程序博客网 时间:2024/05/19 04:29

跟最短路差不多,求次短路就要再记录一个d2数组,表示源点到i的次短距离。分类讨论维护即可。

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#define ll long long#define inf 1LL<<60#define N 5010#define M 100010inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m,h[N],num=0;ll d1[N],d2[N];bool inq[N];struct edge{    int to,next,v;}data[M<<1];void spfa(){    queue<int>q;    for(int i=1;i<=n;++i) d1[i]=d2[i]=inf;    q.push(1);inq[1]=1;d1[1]=0;    while(!q.empty()){        int x=q.front();q.pop();inq[x]=0;        for(int i=h[x];i;i=data[i].next){            int y=data[i].to;            if(d1[x]+data[i].v<d1[y]){                d2[y]=d1[y];d1[y]=d1[x]+data[i].v;                if(!inq[y]) q.push(y),inq[y]=1;            }            else if(d1[x]+data[i].v<d2[y]&&d1[x]+data[i].v>d1[y]){//这条边不是最短路的边                 d2[y]=d1[x]+data[i].v;                if(!inq[y]) q.push(y),inq[y]=1;            }            if(d2[x]+data[i].v<d2[y]){//注意不能else                d2[y]=d2[x]+data[i].v;                if(!inq[y]) q.push(y),inq[y]=1;            }        }    }}int main(){//  freopen("a.in","r",stdin);    n=read();m=read();    while(m--){        int x=read(),y=read(),v=read();        data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].v=v;        data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].v=v;    }    spfa();    printf("%lld\n",d2[n]);    return 0;}
阅读全文
0 0
原创粉丝点击