最大流 增廣路演算法 最小費用最大流

2021-08-15 11:45:10 字數 1611 閱讀 5432

cap>flow代表連通,cap==flow代表不連通

最大流

不停的尋找s連通至t的路徑,更新..直到找不到路徑

注:p[u] ^ 1和p[u]互為方向邊

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1005;

const

int inf = 0x3f3f3f3f;

struct edge

};vector

edges;

vector

g[maxn];

int a[maxn], p[maxn];//起點到i的可改進量,最短路樹上p的入弧編號

void add_edge(int from, int to, int cap)

int maxflow(int s, int t)

if (a[t]) break;

}if (!a[t]) break;

flow += a[t];

for (int u = t; u != s; u = edges[p[u]].from)

edges[p[u]].flow += a[t], edges[p[u] ^ 1].flow -= a[t];

}return flow;

}

最小費用最大流

由於cost可能為負,故用bellmanford尋找s至t的最短路徑,然後更新…直到不連通

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1005;

const

int inf = 0x3f3f3f3f;

struct edge

};vector

edges;

vector

g[maxn];

int a[maxn], p[maxn],d[maxn],inq[maxn],n;//起點到i的可改進量,最短路樹上p的入弧編號

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

bool bellmanford(int s, int t, int &flow, int &cost)

}if (d[t]==inf) return

false;

flow += a[t];

cost += d[t] * a[t];

for (int u = t; u != s; u = edges[p[u]].flow)

edges[p[u]].flow += a[t], edges[p[u] ^ 1].flow -= a[t];

return

true;

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

模板 SPFA增廣 最小費用最大流

簡單的用spfa增廣進行費用流的求解 與ek求最大流類似,只是此時要求最大流的同時費用最小 所以用spfa增廣,就可以費用盡量小 模板 include include include using namespace std const int maxn 705,maxe 144005,inf 0x3...

最小費用最大流

網 絡流的基本問題為 設乙個有向賦權圖g v,e v 其中有兩個特殊的節點s和s s稱為發點,s 稱為收點。圖中各 邊的方向和權數表示允許的流向和最大可能的流量 容量 問在這個網路圖中從發點流出到收點匯集,最大可通過的實際流量為多少?流向的分布情況為怎樣?設有乙個網路圖g v,e v e中的每條邊 ...

最小費用最大流

const int maxn 250 const int maxm 62272 const int inf 0x4ffffff int n,m struct edge edge maxm int head maxn cnt void init void addedge int u,int v,int...