随手一打就是标准的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 }