zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    汪曾祺《生活是很好玩的》有感
    中小学Python编程语言教学
    1. python 基础课程目录
    白盒测试之gmock入门篇
    Apache与Tomcat 区别联系
    白盒测试之gtest第一个demo
    白盒测试之初识gtest工具
    纯手工打造dropdownlist控件
    android 线程的使用总结
    染色板QPlette
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5966241.html
Copyright © 2011-2022 走看看