网络最大流
#include#include #include #include #include #include #include using namespace std;const int maxn=2000+10;const int INF=0x7FFFFFFF;struct Edge{ int from,to,cap,flow;};vector edges;vector G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];int numc[maxn];int numr[maxn];int K[maxn][105];int n,m,s,t;int N,M,A,LS;//求出层次网络bool BFS(){ memset(vis,0,sizeof(vis)); queue Q; Q.push(s); d[s]=0; vis[s]=1; while(!Q.empty()) { int x=Q.front(); Q.pop(); for(int i=0; i e.flow) { vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t];}//加边void AddEdge(int from,int to,int cap){ Edge r; r.from=from; r.to=to; r.cap=cap; r.flow=0; edges.push_back(r); Edge d; d.from=to; d.to=from; d.cap=0; d.flow=0; edges.push_back(d); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1);}//每个阶段来一次DFS增广int DFS(int x,int a){ if(x==t||a==0) return a; int flow=0,f; for(int i=cur[x]; i 0) { e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } return flow;}//多个阶段,多次建立层次网络。int Maxflow(int ss,int tt){ int flow=0; while(BFS()) { memset(cur,0,sizeof(cur)); flow+=DFS(ss,INF); } return flow;}int main(){ int i,j; while(~scanf("%d%d",&M,&N)) { memset(K,0,sizeof(K)); edges.clear(); for(int i=0; i