1:dijkstra算法
基于priority_queue的dijkstra算法,适用于边权值非负。每一次queue.top(),是从V-S中取小的u,并加入S中。并以这个点为基础,对新的V-S中的点进行松弛,只要产生dist的改变,该v点必入优先队列,从而产生一个现象:一个点在优先队列中的次数可能不止一次,但每次出队列的必是最小值,且该点加入S,那么接下来如果该点再出队列,只要continue。
将dist[N]扩展到dist[N][2],use[2]扩展到use[N][2],0代表最短路,1代表次短路,则就扩展到了二维dijkstra算法。
推荐的题目:zju1298 poj3463
贴上dijkstra模板:
2.bellman_ford算法
适用于任意边权为实数的图。运用松弛技术,逐步减少从源s到v的最短路径的估计值dist[v],直至达到实际最短路径。如果图中存在负权回路,则算法报告最短路不存在。
推荐题目:poj 3259 poj1860
bellman_ford模板:
3.SPFA算法
基于先进先出的SPFA算法,适用于边权为实数的值。只要最短路存在,SPFA必定能求出最小值,因为每次将v放入队尾,都是经过松弛操作达到的,则减少了对d[v]的估计,直至最后的最短路径。稍微修改,加个cnt[],则可以判负环
推荐的题目:poj1511 poj3621
SPFA的模板:
4.差分约束系统
下面的博客详细的讲解了差分约束系统
http://imlazy.ycool.com/post.1702305.html
推荐题目:zju1508
讲一些我在做题中的总结:用bellman_ford算法求最短路,得到的就是问题的解,这里也不用关心源点。用SPFA算法,肯定要知道源点,d[v0]=0(隐含的条件),那么有如下注意点:求最短路得问题的最大值,求最长路得问题的最小值。