来源:点击打开链接
求有向图的网络流,DINIC模板过,稍作修改即可。
DINIC还是非递归版比较好的,省时间。
// 1.设置上限MAXN和MAXN 2.初始化数值src, des, nNode 3.init_adj() & ex_addEdge() 4.dinic() #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <queue> #define init_adj() (eid = 0,memset(p, -1, sizeof (p))) using namespace std; const int MAXN=1000,MAXM=120000,INF = 0x3fffffff; struct node { int v, next,flw; } e[MAXM]; int eid, p[MAXN], lv[MAXN],src, des, nNode; void ex_addEdge(int u, int v, int c1, int c2) { e[eid].v = v; e[eid].flw = c1; e[eid].next = p[u]; p[u] = eid++; e[eid].v = u; e[eid].flw = c2; e[eid].next = p[v]; p[v] = eid++; } int bfs() { static int que[MAXN]; int i, u, v, c, cur, f = 0, r = 1; memset(lv, 0, sizeof (lv)); lv[src] = 1, *que = src; while (f < r) { cur = que[f++], f %= MAXN; for (i = p[cur]; ~i; i = e[i].next) { u = cur, v = e[i].v, c = e[i].flw; if (!lv[v] && c) { lv[v] = lv[u] + 1; que[r++] = v, r %= MAXN; } } } return lv[des]; } int dfs() { static int tp[MAXN], stk[MAXN]; memcpy(tp, p, sizeof (p)); int cur, top = -1, flow = 0, u, v, i, part, ind; while (1) { if (top < 0) { for (i = tp[v = src]; ~i; i = e[i].next) if (e[i].flw && lv[e[i].v] == 2) break; if (i == -1) break; stk[++top] = tp[src] = i; } if (e[cur = stk[top]].v != des) { u = e[cur].v; for (i = tp[u]; ~i; i = e[i].next) if (e[i].flw && lv[u] + 1 == lv[e[i].v]) break; if (~i) stk[++top] = tp[u] = i; else lv[u] = INF, --top; } else { for (part = INF, i = 0; i <= top; i++) if (e[stk[i]].flw < part) part = e[stk[ind = i]].flw; flow += part; for (i = 0; i <= top; i++) e[stk[i]].flw -= part, e[stk[i]^1].flw += part; top = --ind; } } return flow; } int dinic() { int ans = 0, t; while (bfs()) while (t = dfs()) ans += t; return ans; } int main() { int testcase; int v,w,flow,res,point,road; cin>>testcase; for(int i=1;i<=testcase;i++) { init_adj(); cin>>point>>road; src=1; des=point; nNode=point; for(int t=1;t<=road;t++) { cin>>v>>w>>flow; ex_addEdge(v,w,flow,0); } res=dinic(); cout<<"Case "<<i<<": "<<res<<endl; } return 0; }