#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define NN 305
#define INF 1<<30
#define CLR(arr,v) memset(arr,v,sizeof(arr))
template<int MaxV,int MaxE>
class MaxFlow{
public:
void Clear(){
pos = head = total = 0;
CLR(h,-1); CLR(cnt,0); CLR(Flow,0);
CLR(gap,0);
}
void add(int u,int v,int f){
num[pos] = v;
cap[pos] = f;
next[pos] = h[u];
h[u] = pos++;
num[pos] = u;
cap[pos] = 0;
next[pos] = h[v];
h[v] = pos++;
}
int GetMaxFlow(int s,int t){
int maxflow = 0,cur = s,minflow = INF;
memcpy(Cur,h,sizeof(h));
Init(t);
while(gap[cur] < t){
int &i = Cur[cur];
for(;i != -1;i = next[i]){
if(cap[i] - Flow[i] > 0 && gap[cur] - gap[ num[i] ] == 1){
minflow = min(minflow,cap[i] - Flow[i]);
pre_v[ num[i] ] = cur;
pre_e[ num[i] ] = i;
cur = num[i];
if(cur == t){
maxflow += minflow;
while(cur != s){
Flow[ pre_e[cur] ] += minflow;
Flow[ pre_e[cur]^1 ] -= minflow;
cur = pre_v[cur];
}
minflow = INF;
}
break;
}
}
if(i == -1){
if(--cnt[ gap[cur] ] == 0) return maxflow;
i = h[cur];
gap[cur] = INF;
for(int j = h[cur];j != -1;j = next[j])
if(gap[ num[j] ] + 1 < gap[cur] && cap[j] > Flow[j])
gap[cur] = gap[ num[j] ] + 1;
if(gap[cur] < INF) ++cnt[ gap[cur] ];
cur = pre_v[cur];
}
}
return maxflow;
}
private:
int h[MaxV],Cur[MaxV],num[MaxE],cap[MaxE],next[MaxE],gap[MaxV],cnt[MaxV],pre_v[MaxV],pre_e[MaxE],Flow[MaxE],que[MaxV];
int pos,head,total;
void Init(int n){
cnt[0] = 1;
que[total++] = n;
while(head < total){
int p = que[head++];
for(int i = h[p]; i != -1;i = next[i]){
if((i&1) && !gap[ num[i] ]){
gap[ num[i] ] = gap[p] + 1;
cnt[ gap[ num[i] ] ]++;
que[total++] = num[i];
}
}
}
}
};
MaxFlow<MaxV,MaxE> g;
使用说明:使用前须先调用Clear()函数进行初始化。