int n,s,t; const int VMAX = 500; int r[VMAX+10][VMAX+10]; int mark[VMAX+10],pre[VMAX+10]; int EK() { int ans=0; int head,tail; while (1) { memset(mark,0,sizeof(mark)); mark[s]=1; head=tail=0; Q[tail++]=s; while (head<tail) { int k=Q[head++]; for (int i=0;i<=t;i++) //根据具体情况改动 if (!mark[i] && r[k][i]) { pre[i]=k; mark[i]=1; if (i==t) break; Q[tail++]=i; } if (mark[t]) break; } if (!mark[t]) break; int ca=inf,p,i=t; while (i!=s) { p=pre[i]; ca=min(ca,r[p][i]); i=p; } ans+=ca; i=t; while (i!=s) { p=pre[i]; r[p][i]-=ca; r[i][p]+=ca; i=p; } } return ans; }