关于最小费用流问题Dijkstra与spfa算法的测试报告

一、 使用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算法效率高很多,在大型网络拓扑图中也是如此,我们这里就不再罗列数据进行测试了。

转载于:https://www.cnblogs.com/readlearn/p/10806401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值