SPFA 小优化*2

/* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define mk make pair
#define maxn 2000010
#define N 2000000
using namespace std;
int n,m,k,s,t,num,hea[maxn],dis[maxn],c[maxn];
int x[maxn],y[maxn],z[maxn],ans=0xfffffff;
int q[maxn],head,tail;
bool f[maxn];
struct node
{
    int u,v,pre,t;
}e[maxn];
void Add(int from,int to,int Dis)
{
    for(int i=hea[from];i;i=e[i].pre)
      if(e[i].v==to)
        {
          e[i].t=min(e[i].t,Dis);
          return;
        }
    num++;
    e[num].u=from;
    e[num].v=to;
    e[num].t=Dis;
    e[num].pre=hea[from];
    hea[from]=num;
}
void SPFA(int x)
{
    memset(dis,127/3,sizeof(dis));
    q[tail++]=x;f[x]=1;dis[x]=0;
    while(head!=tail)
      {
        int k=q[head++];f[k]=0;
        if(head>N)head=1;//循环队列 
        for(int i=hea[k];i;i=e[i].pre)
          {
            int v=e[i].v;
            if(dis[v]>dis[k]+e[i].t)
              {
                dis[v]=dis[k]+e[i].t;
                if(f[v]==0)
                  {
                      if(dis[v]<dis[q[head]]){//SLF 
                          if(--head<0)head=N-1;
                          q[head]=v;
                      }
                      else {
                        q[tail++]=v;
                        if(tail>N)tail=1;
                      }
                  }
              }
          }
      }
}
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    s++;t++;n=n+n*k;
    for(int i=1;i<=m;i++)
      scanf("%d%d%d",&x[i],&y[i],&z[i]),x[i]++,y[i]++;
    for(int i=1;i<=m;i++)
      for(int j=1;j<=k+1;j++)
        {
          Add((x[i]-1)*(k+1)+j,(y[i]-1)*(k+1)+j,z[i]);
          Add((y[i]-1)*(k+1)+j,(x[i]-1)*(k+1)+j,z[i]);
          if(j<=k)
            {
              Add((x[i]-1)*(k+1)+j,(y[i]-1)*(k+1)+j+1,0);
              Add((y[i]-1)*(k+1)+j,(x[i]-1)*(k+1)+j+1,0);
            }
        }
    SPFA((s-1)*(k+1)+1);
    for(int j=1;j<=k+1;j++)
       ans=min(ans,dis[(t-1)*(k+1)+j]); 
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/5966241.html