【模板】dinic求最大流

struct dinic{
	struct ppo{
		int v,c,next;
	}e[N<<2];
	int S,T,tot,h[N],d[N];
	void init(){
		S=0,T=1,tot=0;
		memset(h,-1,sizeof(h));
	}
	void ae(int u,int v,int c){
		e[tot]=ppo{v,c,h[u]};
		h[u]=tot++;
	}
	void add(int u,int v,int c){
		ae(u,v,c);
		ae(v,u,0);
	}
	bool bfs(){
		memset(d,-1,sizeof(d));
		queue<int>q;
		q.push(S);
		d[S]=0;
		while(!q.empty()){
			int u=q.front();q.pop();
			for(int i=h[u];~i;i=e[i].next){
				int x=e[i].v,w=e[i].c;
				if(d[x]==-1&&w){
					d[x]=d[u]+1;
					q.push(x);
				}
			}
		}
		return (d[T]!=-1);
	}
	int dfs(int u,int flow){
		if(u==T) return flow;
		int res=0;
		for(int i=h[u];~i;i=e[i].next){
			int x=e[i].v;
			if(e[i].c&&d[u]+1==d[x]){
				int tmp=dfs(x,min(flow,e[i].c));
				flow-=tmp;
				e[i].c-=tmp;
				e[i^1].c+=tmp;
				res+=tmp;
				if(flow==0) break;
			}
		}
		if(res==0) d[u]=-1;
		return res;
	}
	int solve(){
		int res=0;
		while(bfs()){
			res+=dfs(S,inf);
		}
		return res;
	}
}dick;
posted @ 2020-08-05 18:27  xyq0220  阅读(106)  评论(0编辑  收藏  举报