消圈算法: 先求最大流, 再在Gf中寻找负费用圈并沿它增广
题意:有n个建筑物,m个避难所,已知每个建筑物的坐标和拥有的人及每个避难所的坐标和容量。建筑物i和避难所j的距离为|xi-xj| + |yi-yj| + 1。现在要求把建筑物的人都疏散到避难所。现给出一个方案:建筑物i有x[i][j]的人去j避难所
改进: 增加附加弧(s, t), 费用大于s-t最大费用路(如VC), 弧上的初始流大于s-t最大流(如s出发的弧容量和加1)消圈算法将让尽量多的流移出附加弧, 因此得到的流是最大流. 最后附加弧可能有余量,应当忽略
实际效果: 最小费用增广路算法, 因为Gf中任何s-t路和t-s一定构成负费用圈
最坏情况分析: 每次找负费用圈O(VE), 每次只把费用更新1, 一共需要ECM次(M为最大费用, C为容量), 在稀疏图中总时间复杂度为O(VE^2CM)=O(V^3CM)用途:由于效率极低,因此消圈算法一般用于判断是否为最优解,而不用于求最优解
定理:一个费用流是最小费用流的充要条件是这个费用流的残量网络没有负费用圈。
poj 2175 Evacuation Plan题意:有n个建筑物,m个避难所,已知每个建筑物的坐标和拥有的人及每个避难所的坐标和容量。建筑物i和避难所j的距离为|xi-xj| + |yi-yj| + 1。现在要求把建筑物的人都疏散到避难所。现给出一个方案:建筑物i有x[i][j]的人去j避难所