单源点最短路问题
- spfa算法(由于比bellman-ford优化了一点点,就不记这个了)
1 |
|
spfa算法可以判断过某一个源点是否经过负环。如果要判断全图是否有负环,只需要建立一个超级源点,然后将其与原来图中每一个点相连接,边权设置为0,在用spfa算法处理一下(切记现在点个数为n+1)。
- dijkstra算法(用优先队列处理)
1 |
|
多源点最短路问题
floid算法
floid算法的思想就是dp,并且这个思想可以求出传递闭包。
1 |
|
选择性免费过k条路,如何求最短路?
这里要用分层图的思想
1 |
|
在原来dijkstra算法的基础上增加一维,代表层数,第i层代表的是免费过i次。
那么我们的状态转移方程就是:分别判断是否会更新免费过和收费过的距离dis。
差分约束算法
给出一组包含 \(m\) 个不等式,有 \(n\) 个未知数的形如:
\[ \begin{cases} x_{c_1}-x_{c'_1}\leq y_1 \\x_{c_2}-x_{c'_2} \leq y_2 \\ \cdots\\ x_{c_m} - x_{c'_m}\leq y_m\end{cases}\]
的不等式组,求任意一组满足这个不等式组的解。
这个题的意思就是将\(c'\)向\(c\)建边,权值为\(y\),看这个图有没有负环。用spfa算法处理即可。
无边图的次短路算法
1 |
|
无向图的次短路比有向图的k短路问题好处理且思想不一样。
这里只需要再维护一个次小值就好了,思想是:在dijkstra算法的基础上,解除重复访问的限制,然后根据以下方法更新
1 | // 比较的时候涉及dis[]就要把该状态压进状态的优先队列 |