最小費用最大流:
在最大流有多組解時,給每條邊在附上乙個單位費用的量,問在滿足最大流時的最小費用是多少?
思想:
給出乙個容量網路,那他的最大流一定是乙個定值(即使是有多個一樣的最大值)。所以我們從開始的可行流開始增廣時,最終的增廣量是一定的。所以為了滿足最小費用我們只需要每次找最小費用的增廣路即可,直到流量為最大值。這個問題僅僅是在求增廣路時先考慮費用最小的增廣路,其他思想和ek思想一樣。
我們學過spfa求最短路演算法(bellman-ford的佇列優化),所以我們將弧的費用看做是路徑長度,即可轉化為求最短路的問題了。只需要所走的最短路滿足兩個條件即可:1可增廣cap> flow,2路徑變短d[v]>d[u]+cost< u,v> 。
關於建圖的方式和dinic,isap演算法一樣,如有疑問可以去我們其他相關部落格看看
mcmf模板:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define n 1000
#define inf 100000000
struct edge;};
struct mcmf
bool spfa(int s,int t,int &flow,int &cost)//尋找最小費用的增廣路,使用引用同時修改原flow,cost}}
}if(d[t]==inf) return
false;//匯點不可達則退出
flow+=a[t];
cost+=d[t]*a[t];
int u=t;
while(u!=s)//更新正向邊和反向邊
return
true;
}int mincotmaxflow(int s,int t)
};int main()
最小費用最大流模板
const int n 1010 點 const int m 2 10010 邊 const int inf 1000000000 struct nodee m int next1 m point n dis n q n pre n ne ne為已新增的邊數,next,point為鄰接表,dis為花...
最小費用最大流模板
一 最小費用最大流的模型 在保證流量最大的前提下,所需的費用最小,這就是最小費用最大流問題 帶有費用的網路流圖 g v,e,c,w v 頂點 e 弧 c 弧的容量 w 單位流量費用。任意的弧對應非負的容量c i,j 和單位流量費用w i,j 滿足 流量f是g的最大流。在f是g的最大流的前提下,流的費...
最小費用最大流 模板
因為含有負權邊,所以使用spfa進行增廣。指定流量的最小費用流可以初始化乙個f,然後每次一直迴圈到f 0為止。函式返回的是最大流,當然經過少量修改可以返回最小費用,利用最小流量乘以相應的費用即可。prevv記錄父節點,preve記錄當前節點對應父節點的第幾條邊。const int inf 0x3ff...