单源最短路模板_SPFA_Dijkstra(堆优化)_C++
2016-10-06 21:40
441 查看
随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点
Dijkstra+堆优化,调了我3个多小时终于调到正确的最优的模板
void spfa() { int i,x,k; for (i=2;i<=n;i++) { d[i]=oo; f[i]=1; } d[1]=0; q.push(1); while (!q.empty()) { x=q.front(); q.pop(); f[x]=1; for (i=first[x];i;i=next[i]) { k=v[i]; if (d[k]>d[x]+w[i]) { d[k]=d[x]+w[i]; if (f[k]) { q.push(k); f[k]=0; } } } } }
Dijkstra+堆优化,调了我3个多小时终于调到正确的最优的模板
void down(int x) { x<<=1; if (x>t) return; if (x<t&&d[s[x+1]]<d[s[x]]) x++; if (d[s[x]]>=d[s[x>>1]]) return; swap(s[x],s[x>>1]); swap(p[s[x]],p[s[x>>1]]); down(x); } void up(int x) { if (x==1||d[s[x>>1]]<=d[s[x]]) return; swap(s[x],s[x>>1]); swap(p[s[x]],p[s[x>>1]]); up(x>>1); } void dijkstra() { int i,x,k; t=s[1]=1; for (i=2;i<=n;i++) d[i]=oo; while (t) { x=s[1]; s[1]=s[t--]; p[s[1]]=1; p[x]=-1; down(1); for (i=first[x];i;i=next[i]) { k=v[i]; if (p[k]==-1) continue; if (!p[k]) { s[++t]=k; p[k]=t; } if (d[k]>d[x]+w[i]) { d[k]=d[x]+w[i]; up(p[k]); } } } }
相关文章推荐
- 最短路 + 邻接表 + 堆优化(模板)(Dijkstra + SPFA)
- 最短路模板[spfa][dijkstra+堆优化][floyd]
- 最短路模板[spfa][dijkstra+堆优化][floyd]
- 【原创】最短路模板 Floyd,优先队列优化dijkstra,SPFA
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- TOJ 2217. Invitation Cards【最短路dijkstra+堆优化或者SPFA】
- 最短路--dijkstra+优先队列优化模板
- HDU2544 - 最短路 - dijkstra/spfa的模板最短路
- POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)
- poj 1847 最短路 dijkstra模板(vector邻接表+队列优化)
- 最短路练习10/poj/1511 Invitation Cards ,(两次spfa),(单源最短路,优先队列优化的Dijkstra)
- 最短路模板 floyd+dijkstra+spfa
- 单源最短路---dijkstra模板(二叉堆优化)
- Dijkstra堆优化与SPFA模板
- aoj-2249 Road Construction 单源最短路dijkstra+堆优化(模板)
- 最短路模板 Dijkstra+Floyd+SPFA
- [模板]最短路 (Floyd, Spfa, Dijkstra,
- ACM_最短路模板(SPFA,Dijkstra,Floyd)
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- poj 3159 Candies(查分约束+堆栈优化的spfa最短路模板)