不算萌新,Dinic求教
查看原帖
不算萌新,Dinic求教
183609
hhoppitreeMadeline楼主2020/7/21 12:23
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int res=0;
	bool zf=0;
	char c;
	while(((c=getchar())<'0'||c>'9')&&c!='-');
	if(c=='-')zf=1;
	else res=c-'0';
	while((c=getchar())>='0'&&c<='9')res=(res<<3)+(res<<1)+c-'0';
	return (zf?-res:res);
}
int n,m;
int to[800005],head[5005],nxt[800005],val[800005],cnt;
int sx[5005];
int maxflow;
int cur[5005];
inline void addedge(int x,int y,int z){
	nxt[cnt]=head[x];
	head[x]=cnt;
	to[cnt]=y;
	val[cnt]=z;
	cnt++;
	return;
}
inline bool bfs(){
	for(register int i=0;i<=n+m+1;i++)cur[i]=head[i],sx[i]=0;
	sx[0]=1;
	queue<int>Q;
	Q.push(0);
	while(!Q.empty()){
		int x=Q.front();Q.pop();
		for(register int i=head[x];i;i=nxt[i]){
			if(!val[i]||sx[to[i]])continue;
			int v=to[i];
			sx[v]=sx[x]+1;
			Q.push(v);
		}
	}
	return sx[n+m+1];
}
void dfs(int now,int flow){
	if(now==n+m+1){
		maxflow+=flow;
		return;
	}
	if(!flow)return;
	for(register int i=cur[now];i;i=nxt[i]){
		cur[now]=i;
		int v=to[i];
		if(sx[v]!=sx[now]+1||!val[i])continue;
		int w=min(flow,val[i]);
		int tmp=-maxflow;
		dfs(v,w);
		tmp+=maxflow;
		flow-=tmp;
		val[i]-=tmp;
		val[i^1]+=tmp;
	}
	return;
}
inline void dinic(){
	while(bfs())dfs(0,0x7fffffff);
	return;
}
signed main(){
	n=read(),m=read();int t=read(),x,y;
	while(t--)x=read(),y=read()+n,addedge(x,y,0x7ffffff),addedge(y,x,0); 
	for(register int i=1;i<=n;i++)addedge(0,i,1),addedge(i,0,0);
	for(register int i=n+1;i<=n+m;i++)addedge(i,n+m+1,1),addedge(n+m+1,i,0);
	dinic();
	cout<<maxflow<<'\n';
	return 0;
}
2020/7/21 12:23
加载中...