网络流-最小费用最大流
定义 有时,网络中每条边除了容量还有费用。最小费用最大流(MincostMaxflow,简称MCMF)就是在最大流的基础上,费用最小。 实现 和EK类似,最小费用最大流的求法也是暴力寻找增广路,但是不是用Bfs进行增广,而是用Bellman-Ford或者Spfa进行增广。寻找增广路时,先要满足可以增广,然后检查费用是否更优秀,两者都满足,才修正。这样增广下来,不难发现肯定满足费用最小。 这个算法的效率是玄学……但是实际运用中应该可能大概够了吧。 模板 实在没找到模板题,用 POJ2135 当模板题好了。 因为每条道路只能通过一次,所以我们可以认为每条道路的容量为1,费用为这条道路的长度(由于这道题是双向边,所以必须正反都建边)。但是要走回来怎么办?因为不能重复走,所以走回来就等价于走两次(已双向建边),我们可以增加两个虚拟节点0和n+1:0向1构造一条容量为2,费用为0的边,n向n+1构造一条容量为2,费用为0的边。然后直接刷最小费用最大流即可。 #include<cstdio> #include<cstring> #include<algorithm> using namespace std ; const int maxn= 1000 ,maxm= 40000 ; int n,m,E,lnk[maxn+ 5 ],son[maxm+ 5 ],nxt[maxm+ 5 ]; int