最小費用最大流模板

2021-08-08 22:15:16 字數 979 閱讀 9494

#includeusing namespace std;

#define inf 0x3f3f3f3f

typedef long long ll;

const int m=2010;//邊數注意啦,我們這東西是有逆向邊的,所以邊數要×2哦

const int n=510;//點數

struct edge

e[11000];

int head[n],tot;

int d[n], pre[n], path[n];//pre是用來記錄路徑的,表示這個點的上乙個點是誰,path是用來記錄路徑所對應的邊數

bool vis[n];

void init()

void addedge(int s, int t, int cap, int cost)

int spfa(int s, int t)}}

}return d[t] != inf;

}int mincostmaxflow(int s, int t,int &cost)

flow += minn;

cost += minn * d[t];

}return flow;

}int main()

for (int k=1;k<=m;k++)

int cost(0);

mincostmaxflow(0,n+1,cost);

printf("%d\n",-cost);

}}

這個的思路也是找增廣路,但是有所不同,我每次找的增廣路都是單位費用最小的增廣路,這樣我們找到最大流之後,找到的就是最小費用最大流

其實這個可以幹很多事情,也可以求最小費用可行流,這個在求的時候,找到的流量夠了退出迴圈即可。

那如何求最小費用的增廣路呢?

我們使用的是spfa(可能有負邊嘛)

把cost當成路徑長度就好啦

d【i】就表示從起點到i乙個單位的流要的花費

最小費用最大流模板

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...