//做Hust的dance party时候学的一个板,以后记得常用哈,错的才可以改进。 const int VMAX = 400; int r[VMAX+10][VMAX+10]; //余留网 int Q[VMAX+10],level[VMAX+10]; //用于bfs的队列和各点层次 //广搜求层次图 bool bfs() { memset(level,-1,sizeof(level)); int head=0,tail=0; Q[tail++]=s; level[s]=0; while (head<tail) { int v=Q[head++]; for (int i=0;i<=t;i++) //枚举范围要具体定 if (r[v][i] && level[i]==-1) { level[i]=level[v]+1; Q[tail++]=i; } } return (level[t]!=-1); } //深搜扩充流 int dfs(int v,int c) { if (v==t) return c; //遇汇点结束 int sum=c; for (int i=0;i<=t && c;i++) if (r[v][i] && level[v]+1==level[i]) { int a=dfs(i,min(c,r[v][i])); //递归确定本次要扩充的流大小 r[v][i]-=a; //增流 r[i][v]+=a; c-=a; } return sum-c; //返回从v点扩充的流大小 } //dinic算法主体,不断求层次图并增流,直至汇点不可达 int dinic() { int ans=0; while (bfs()) { ans+=dfs(s,inf); } return ans; }