bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路

来源:互联网 发布:算法复杂性影响因素 编辑:程序博客网 时间:2024/05/29 19:37

不太会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;}


0 0
原创粉丝点击