单源最短路模板_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 }

 

posted @ 2016-10-06 21:40  Hadilo  阅读(2186)  评论(0编辑  收藏  举报