#include #include #include #include #include #include #include #define inf 0x7fffffff using namespace std; const int maxn=600; const int M = 100000+10; struct Edge { int to,cap,next; }edge[M*2]; int head[maxn],edgenum; int n,m,from,to,vnum,s,t; void add(int u,int v,int cap) { edge[edgenum].to=v; edge[edgenum].cap=cap; edge[edgenum].next=head[u]; head[u]=edgenum++; edge[edgenum].to=u; edge[edgenum].cap=0; edge[edgenum].next=head[v]; head[v]=edgenum++; } int level[maxn]; int gap[maxn]; void bfs(int to) { memset(level,-1,sizeof(level)); memset(gap,0,sizeof(gap)); level[to]=0; gap[level[to] ]++; queue Q; Q.push(to); while (!Q.empty()) { int u=Q.front() ;Q.pop() ; for (int i=head[u] ;i!=-1 ;i=edge[i].next) { int v=edge[i].to; if (level[v] != -1) continue; level[v]=level[u]+1; gap[level[v] ]++; Q.push(v); } } } int cur[maxn]; int pre[maxn]; int SAP(int from,int to) { bfs(to); memset(pre,-1,sizeof(pre)); memcpy(cur,head,sizeof(head)); int u=pre[from]=from,flow=0,aug=inf; gap[from]=vnum; while (level[from]