Spfa是Bellman-Ford的优化。但是spfa还有优化余地
一.空间优化,用循环队列
要点:
1、判断队列为空:只能用if (f!=r)
if(f<r)是错误的
2、取余操作:只要加到f、r操作的
所有地方就行了
二.简单而有效的优化SLF
如果队首元素较大,则将新元素插到队首,否则插到队尾
SLF优化(341.cpp)要点:
1、比较新节点和队首节点时队首为que[l+1]
2、左开右闭的双端队列,插入队首时要后递减que[l--] = ths->index;
3、SLF的原理见http://tieba.baidu.com/f?kz=1192850879
(貌似网上都说用SLF再加LLL,反而会更慢)
三.前向星优化
速度比用链表快,主要耗时在快排上,如果用链式前向星,几乎就完美了,快排都不需要,前向星是个好东西啊。
前向星要点:
1、读入边表
2、根据起始点排序
3、计算以每个点为起始点的数组中一段的边
for(long i=1;i<m+1;i++)
if(f[bian[i].f]==0)
f[bian[i].f]=i;
(优化:链式前向星
http://www.cnblogs.com/ACoder/archive/2011/04/06/2006323.html)
另外 Heap+dijkstra也很高效,代码实现复杂一些
(rqnoj341星门跳跃,裸spfa+链表过不了,加上二或三优化均能AC)