#include #include #include #include #include #include using namespace std; #define MAXN 4444 #define inf 1<<30 struct Node{ int v,w; Node(int vv,int ww):v(vv),w(ww){}; }; int n; bool mark[MAXN]; int dist[MAXN]; vector >G; void spfa() { memset(mark,false,sizeof(mark)); fill(dist,dist+n+2,inf); dist[1]=0; queueque; que.push(1); while(!que.empty()){ int u=que.front(); que.pop(); mark[u]=false; for(int i=0;ique; que.push(vt); level[vt]=0; gap[level[vt]]++; while(!que.empty()){ int u=que.front(); que.pop(); for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(level[v]!=-1)continue; level[v]=level[u]+1; gap[level[v]]++; que.push(v); } } } int pre[MAXN],cur[MAXN]; int SAP(int vs,int vt) { bfs(vt); memset(pre,-1,sizeof(pre)); memcpy(cur,head,sizeof(head)); int u=pre[vs]=vs,aug=inf,maxflow=0; gap[0]=NV; while(level[vs]0&&level[u]==level[v]+1){ flag=true; aug=min(aug,edge[i].cap); pre[v]=u; u=v; if(v==vt){ maxflow+=aug; for(u=pre[v];v!=vs;v=u,u=pre[u]){ edge[cur[u]].cap-=aug; edge[cur[u]^1].cap+=aug; } aug=inf; } break; } } if(flag)continue; int minlevel=NV; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(edge[i].cap>0&&level[v]