#include #include #include #include #include #include #include #include #define mt(a,b) memset(a,b,sizeof(a)) using namespace std; const int M = 123456; const int inf = 0x7f7f7f7f; int profit[30],cost[60]; class Tarjan { public: struct E { int u,v,next; } e[M<<4]; int le,head[M],Index,Bcnt,num[M],belong[M],dfn[M],low[M]; bool instack[M]; stack s; void tarjan(int u) { dfn[u]=low[u]=++Index; instack[u]=true; s.push(u); int v; for(int i=head[u]; ~i; i=e[i].next) { v=e[i].v; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) { low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]) { Bcnt++; do { v=s.top(); s.pop(); instack[v]=false; belong[v]=Bcnt; num[Bcnt]++; } while(u!=v); } } void init() { le=Index=Bcnt=0; mt(head,-1); mt(num,0); mt(dfn,0); mt(low,0); mt(instack,0); while(!s.empty()) s.pop(); } void add(int u,int v) { e[le].u=u; e[le].v=v; e[le].next=head[u]; head[u]=le++; } void solve(int n) { for(int i=1; i<=n; i++) { if(!dfn[i]) { tarjan(i); } } } int getbcnt() { return Bcnt; } int getbelong(int id) { return belong[id]; } int getnum(int id) { return num[id]; } } gx; class Dinic { struct E { int u,v,next,flow; } e[M<<1]; int le,flow,head[M],temp[M],cur[M],level[M],path[M]; bool used[M]; queue q; public: int getflow() { return flow; } bool bfs(int s,int t) { mt(level,-1); while(!q.empty()) q.pop(); q.push(s); level[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u]; ~i; i=e[i].next) { int v=e[i].v; if(level[v]==-1&&e[i].flow) { level[v]=level[u]+1; q.push(v); if(v==t) return true; } } } return false; } void init() { le=0; mt(head,-1); } void add(int u,int v,int flow) { e[le].u=u; e[le].v=v; e[le].flow=flow; e[le].next=head[u]; head[u]=le++; e[le].u=v; e[le].v=u; e[le].flow=0; e[le].next=head[v]; head[v]=le++; } void solve(int s,int t) { int p,now,tempp; bool flag; flow=0; while(bfs(s,t)) { for(int i=0; i