2018-team4-modules-最大流/最小割
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
struct Edge{int b,v,n;}e[M];
void add_Edge(int a,int b,int v) { e[++cnt] = (Edge){b,v,h[a]}, h[a] = cnt; }
void add(int a,int b,int v) {add_Edge(a,b,v),add_Edge(b,a,0);}
bool BFS() {
bool flag = 0;
for (int i=1;i<=tot;i++) p[i] = 0;
for (int i=1;i<=tot;i++) cur[i] = h[i];
queue<int> q;
p[S] = 1;
q.push(S);
while (!q.empty()) {
int u = q.front(); q.pop();
if (u == T) flag = 1;
for (int i=h[u];i;i=e[i].n) {
int v = e[i].b, cp = e[i].v;
if (!p[v] && cp > 0)
p[v] = p[u] + 1, q.push(v);
}
}
return flag;
}
int DFS(int u,int flow) {
if (u == T) return flow;
int f = flow, g = 0;
for (int i=cur[u];i;i=e[i].n) {
cur[u] = i;
int v = e[i].b, cp = e[i].v, tmp = 0;
if (p[v] == p[u]+1 && cp>0 && (tmp=DFS(v,min(f,cp))) >0) {
e[i].v -= tmp;
e[i^1].v += tmp;
f -= tmp;
g += tmp;
}
}
return g;
}
}}}
struct Edge{int b,v,n;}e[M];
void add_Edge(int a,int b,int v) { e[++cnt] = (Edge){b,v,h[a]}, h[a] = cnt; }
void add(int a,int b,int v) {add_Edge(a,b,v),add_Edge(b,a,0);}
bool BFS() {
bool flag = 0;
for (int i=1;i<=tot;i++) p[i] = 0;
for (int i=1;i<=tot;i++) cur[i] = h[i];
queue<int> q;
p[S] = 1;
q.push(S);
while (!q.empty()) {
int u = q.front(); q.pop();
if (u == T) flag = 1;
for (int i=h[u];i;i=e[i].n) {
int v = e[i].b, cp = e[i].v;
if (!p[v] && cp > 0)
p[v] = p[u] + 1, q.push(v);
}
}
return flag;
}
int DFS(int u,int flow) {
if (u == T) return flow;
int f = flow, g = 0;
for (int i=cur[u];i;i=e[i].n) {
cur[u] = i;
int v = e[i].b, cp = e[i].v, tmp = 0;
if (p[v] == p[u]+1 && cp>0 && (tmp=DFS(v,min(f,cp))) >0) {
e[i].v -= tmp;
e[i^1].v += tmp;
f -= tmp;
g += tmp;
}
}
return g;
}