一、 使用spfa算法解决最小费用流问题
1. 算法原理
实际是用队列优化的Bellman-ford算法,可以允许负边权的存在。SPFA算法通过维护一个队列,使得一个节点的当前最短路径被更新之后没有必要立刻去更新其他的节点,从而大大减少了重复的操作次数。在负边权和稀疏图上可完全替代Bellman-ford算法,但是与Dijkstra算法与Bellman-ford算法都不同,SPFA的算法时间效率是不稳定的,即它对于不同的图所需要的时间有很大的差别。在非负边权上最好还是用性能稳定的Dijkstra算法。时间复杂度O(kE)。
spfa算法的具体实现步骤见上一篇博客
2. 测试环境
Windows
VS2013
电脑处理器 Core i7-4710MQ
3. 测试数据:
5 6
0 1 3 20
1 3 4 20
3 2 5 20
0 4 4 40
4 2 3 20
4 1 6 30
0 2 7
4. 测试结果:
- 使用spfa解决最小费用流问题的平均运行时间为7.6381275ms
二、使用改进的Dijkstra求解最小费用流问题
1. 算法原理
- 最小费用流还可以采用加入“势函数”后的Dijkstra算法解决。改进的Dijkstra,也可以接受负权边的存在,因为对于每条边e=(u,v),有如下事实成立:h(v)≤h(u)+e.cost(其中h[u]表示s到u的最短距离)。因此令dist[v]=dist[u]+e.cost+h[u]-h[v],。那么所有的dist值必然大于等于0,这样就能用Dijkstra算法求解了。整个算法的时间复杂度是O(F*ElogV)(F是流量,E是边数,V是顶点数)。
2. 测试环境
Windows
VS2013
电脑处理器 Core i7-4710MQ
3. 测试数据:
5 6
0 1 3 20
1 3 4 20
3 2 5 20
0 4 4 40
4 2 3 20
4 1 6 30
0 2 7
4. 测试结果:
- 使用改进的Dijkstra解决最小费用流问题的平均运行时间为2.3177425ms
三、总结
因此使用改进的Dijkstra解决最小费用流问题,比用spfa算法效率高很多,在大型网络拓扑图中也是如此,我们这里就不再罗列数据进行测试了。