模板总结归纳:
//src 源点, sink汇点, g、e存边的邻接表
const int inf = 1000000000; //1e9
const int maxn = 20000, maxm = 500000;
struct Egde {
int v, f, nxt;
};
int n, src, sink;
int g[maxn + 10];
int nume;
struct Edge e[maxm * 2 + 10];
void addedge(int u, int v, int c) // u到v容量为c的边, 加边前nume = 1, memset g = 0;(init)
{
e[++nume].v = v;
e[nume].f = c;
e[nume].nxt = g[u];
g[u] = nume;
e[++nume].v = u;
e[nume].f = 0;
e[nume].nxt = g[v];
g[v] = nume;
}
void init()
{
memset(g, 0, sizeof(g));
nume = 1;
//加边
}
queue<int> que;
bool vis[maxn + 10];
int dist[maxn + 10];
void bfs()
{
memset(dist, 0, sizeof(dist));
while(!que.empty()) que.pop();
vis[src] = true;
que.push(src);
while(!que.empty()){
int u = que.front(); que.pop();
for(int i = g[u]; i; i = e[i].nxt)
if(e[i].f && !vis[e[i].v]){
que.push(e[i].v);
dist[e[i].v] = dist[u] + 1;
vis[e[i].v] = true;
}
}
}
int dfs(int u, int delta)
{
if(u == sink){
return delta;
}else{
int ret = 0;
for(int i = g[u]; delta && i; i = e[i].nxt)
if(e[i].f && dist[e[i].v] == dist[u] + 1){
int dd = dfs(e[i].v, min(e[i].f, delta));
e[i].f -= dd;
e[i ^ 1].f += dd;
delta -= dd;
ret += dd;
}
return ret;
}
}
int maxflow()
{
int ret = 0;
while(true)
{
memset(vis, 0, sizeof(vis));
bfs();
if(!vis[sink]) return ret;
ret += dfs(src, inf);
}
}
实战模板题:HDU 1532 Drainage Ditches
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf = 1000000000; //1e9
const int maxn = 210, maxm = 210;
struct Egde {
int v, f, nxt;
}e[maxm * 2 + 10];
int src, sink;
int g[maxn + 10];
int nume;
void addedge(int u, int v, int c)
{
e[++nume].v = v;
e[nume].f = c;
e[nume].nxt = g[u];
g[u] = nume;
e[++nume].v = u;
e[nume].f = 0;
e[nume].nxt = g[v];
g[v] = nume;
}
void init()
{
memset(g, 0, sizeof(g));
nume = 1;
}
queue<int> que;
bool vis[maxn + 10];
int dist[maxn + 10];
void bfs()
{
memset(dist, 0, sizeof(dist));
while(!que.empty()) que.pop();
vis[src] = true;
que.push(src);
while(!que.empty()){
int u = que.front(); que.pop();
for(int i = g[u]; i; i = e[i].nxt)
if(e[i].f && !vis[e[i].v]){
que.push(e[i].v);
dist[e[i].v] = dist[u] + 1;
vis[e[i].v] = true;
}
}
}
int dfs(int u, int delta)
{
if(u == sink){
return delta;
}else{
int ret = 0;
for(int i = g[u]; delta && i; i = e[i].nxt)
if(e[i].f && dist[e[i].v] == dist[u] + 1){
int dd = dfs(e[i].v, min(e[i].f, delta));
e[i].f -= dd;
e[i ^ 1].f += dd;
delta -= dd;
ret += dd;
}
return ret;
}
}
int maxflow()
{
int ret = 0;
while(true)
{
memset(vis, 0, sizeof(vis));
bfs();
if(!vis[sink]) return ret;
ret += dfs(src, inf);
}
}
int main()
{
int m, n;
while(cin >> n >> m)
{
init();
int a, b, c;
while(n--)
{
scanf("%d%d%d", &a, &b, &c);
addedge(a, b, c);
}
src = 1;
sink = m;
cout << maxflow() << endl;
}
return 0;
}