模板 最小費用最大流

2022-05-07 22:36:17 字數 1970 閱讀 4115

spfa版本:

#includeusing namespace std;

namespace spfa_mincost_maxflow edge[maxm];

int head[maxn],tol;

int pre[maxn],dis[maxn];

bool vis[maxn];

void init()

void add_edge(int u,int v,int cap,int cost)

bool spfa(int s,int t) }}

}if(pre[t]==-1)

return false;

else

return true;

}int mincost,maxflow;

void mincost_maxflow(int s,int t)

for(int i=pre[t]; i!=-1; i=pre[edge[i^1].to])

flow+=tp;

}mincost=cost;

maxflow=flow;

return;

}}using namespace spfa_mincost_maxflow;

int main()

mincost_maxflow(s,t);

printf("%d %d\n",maxflow,mincost);

}

dijkstra版本:

這個版本不容易被卡,據說會快70%。缺點是要控制負數費用不能負得太離譜,不然換 long long 試試吧。

```cpp

#includeusing namespace std;

typedef long long ll;

typedef pairpii;

const int maxn = 5000;

const int inf = 0x3f3f3f3f;

struct edge

edge(int to, int _cap, int _cost, int _flow) : to(to), cap(_cap), cost(_cost), flow(_flow) {}

};struct mincostmaxflow

//加邊

void addedge(int from, int to, int cap, int cost)

//flow是自己傳進去的變數,就是最後的最大流,返回的是最小費用

int mincostmaxflow(int s, int t, int f, int& flow) }}

if(dis[t] == inf)

break;

for(int i = 0; i <= v; ++i)

h[i] += dis[i];

int d = f;

for(int v = t; v != s; v = prev[v])

d = min(d, g[prev[v]][pree[v]].cap);

f -= d, flow += d, cost += d * h[t];

for(int v = t; v != s; v = prev[v])

}return cost;

}} mcmf;

inline int read()

return x;

}int a[2005];

int main()

for(int i = 1; i <= n; ++i)

for(int j = i + 1; j <= n; ++j)

if(a[j] >= a[i])

mcmf.addedge(i + n, j, 1, 0);

int flow = 0;

printf("%d\n", -mcmf.mincostmaxflow(s1, t, inf, flow));

}

最小費用最大流模板

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