模板:网络流

最大流Dinic算法:

bool bfs(int s){
	queue<int>q;
	memset(dep,0,sizeof(dep));
	dep[s]=1;
	q.push(s);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=pre[x];i;i=nxt[i]){
			int y=to[i];
			if(w[i]&&!dep[y]){
				q.push(y);
				dep[y]=dep[x]+1;
				if(y==t) return 1;
			}
		}
	}
	return 0;
}
int Dinic(int x,int flow){
	if(x==t) return flow;
	int rest=flow,k;
	for(int i=pre[x];i&&rest;i=nxt[i]){
		int y=to[i];
		if(w[i]&&dep[y]==dep[x]+1){
			k=Dinic(y,min(rest,w[i]));
			if(!k) dep[y]=0;
			w[i]-=k;
			w[i^1]+=k;
			rest-=k;
		}
	}
	return flow-rest;
}
int maxflow(){
	int flow=0,max_flow=0;
	while(bfs(s)){
		while(flow=Dinic(s,inf))
			max_flow+=flow;
	}
	return max_flow;
}

未填。。坑

posted @ 2019-08-08 17:53  xukl21  阅读(110)  评论(0编辑  收藏  举报