一、dinic最大流
我的模板。模板上已经有了dfs上的优化(比我以前的快多了。。)优化啊优化。
bool bfs(int st,int ed) { while(!q.empty()) q.pop(); memset(d,-1,sizeof(d)); q.push(st); d[st]=0; while(!q.empty()) { int x=q.front();q.pop(); for(int i=first[x];i!=-1;i=a[i].next) { int y=a[i].y; if(d[y]==-1 && a[i].d>0) { d[y]=d[x]+1; q.push(y); } } } return (d[ed]!=-1); } int dfs(int x,int flow,int ed) { int k,p,r=0; if(x==ed) return flow; for(int i=first[x];i!=-1;i=a[i].next) { int y=a[i].y; if(d[y]==d[x]+1 && a[i].d>0) { p=minn(a[i].d,flow-r); p=dfs(y,p,ed); r+=p; //优化,把从这个点开始能流的全部流了 a[i].d-=p; a[i^1].d+=p; } if(r==flow) break; // 优化 } if(!r) d[x]=-1; //优化 return r; } int dinic(int st,int ed) { int ans=0; while(bfs(st,ed)) { int k; while(k=dfs(st,INF,ed)) ans+=k; } return ans; }