zoukankan      html  css  js  c++  java
  • 单源最短路模板_SPFA_Dijkstra(堆优化)_C++

      随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点

     1 void spfa()
     2 {
     3     int i,x,k;
     4     for (i=2;i<=n;i++)
     5     {
     6         d[i]=oo;
     7         f[i]=1;
     8     }
     9     d[1]=0;
    10     q.push(1);
    11     while (!q.empty())
    12     {
    13         x=q.front();
    14         q.pop();
    15         f[x]=1;
    16         for (i=first[x];i;i=next[i])
    17         {
    18             k=v[i];
    19             if (d[k]>d[x]+w[i])
    20             {
    21                 d[k]=d[x]+w[i];
    22                 if (f[k])
    23                 {
    24                     q.push(k);
    25                     f[k]=0;
    26                 }
    27             }
    28         }
    29     }
    30 }

      Dijkstra+堆优化,调了我3个多小时终于调到正确的最优的模板

     1 void down(int x)
     2 {
     3     x<<=1;
     4     if (x>t) return;
     5     if (x<t&&d[s[x+1]]<d[s[x]]) x++;
     6     if (d[s[x]]>=d[s[x>>1]]) return;
     7     swap(s[x],s[x>>1]);
     8     swap(p[s[x]],p[s[x>>1]]);
     9     down(x);
    10 }
    11 void up(int x)
    12 {
    13     if (x==1||d[s[x>>1]]<=d[s[x]]) return;
    14     swap(s[x],s[x>>1]);
    15     swap(p[s[x]],p[s[x>>1]]);
    16     up(x>>1);
    17 }
    18 void dijkstra()
    19 {
    20     int i,x,k;
    21     t=s[1]=1;
    22     for (i=2;i<=n;i++) d[i]=oo;
    23     while (t)
    24     {
    25         x=s[1];
    26         s[1]=s[t--];
    27         p[s[1]]=1;
    28         p[x]=-1;
    29         down(1);
    30         for (i=first[x];i;i=next[i])
    31         {
    32             k=v[i];
    33             if (p[k]==-1) continue;
    34             if (!p[k])
    35             {
    36                 s[++t]=k;
    37                 p[k]=t;
    38             }
    39             if (d[k]>d[x]+w[i])
    40             {
    41                 d[k]=d[x]+w[i];
    42                 up(p[k]);
    43             }
    44         }
    45     }
    46 }
  • 相关阅读:
    Python基础之zip和enumerate
    python3中map()函数用法
    python列表推导式
    python面试常问的几个内置装饰器:@staticmethod、@classmethod和@property
    linux的解压与压缩
    python中 s f各种转移字符含义
    fixture 调用函数名传参(转载)
    3.css选择器
    实战有感3
    实战有感2-轮播图
  • 原文地址:https://www.cnblogs.com/hadilo/p/5934679.html
Copyright © 2011-2022 走看看