二分图最大匹配 最大流实现

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=INT_MAX;
int n,m,e,s,t;
struct Graph {
	int nxt,to,w;
} edge[N<<1];
int head[N],cnt=1;
void add(int u,int v,int w) {
	cnt++;
	edge[cnt].to=v;
	edge[cnt].nxt=head[u];
	edge[cnt].w=w;
	head[u]=cnt;
}
int dis[N],vis[N],cur[N];
bool bfs() {
	for(int i=1; i<=n+m+2; i++) {
		vis[i]=0;
		dis[i]=inf;
		cur[i]=head[i];
	}
	queue<int>q;
	q.push(s);
	vis[s]=1,dis[s]=0;
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u]; i; i=edge[i].nxt) {
			int v=edge[i].to;
			if(edge[i].w&&dis[u]+1<dis[v]) {
				dis[v]=dis[u]+1;
				if(!vis[v]) {
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	return dis[t]!=inf;
}
int dfs(int u,int flow) {
	if(u==t)return flow;
	vis[u]=1;
	int rlow;
	for(int i=cur[u]; i; i=edge[i].nxt) {
		cur[u]=i;
		int v=edge[i].to;
		if(edge[i].w&&dis[u]+1==dis[v]) {
			if(rlow=dfs(v,min(flow,edge[i].w))) {
				edge[i].w-=rlow;
				edge[i^1].w+=rlow;
				return rlow;
			}
		}
	}
	return 0;
}
int maxflow=0;
int Dinic() {
	int flow;
	while(bfs()) {
		while(flow=dfs(s,inf))
			maxflow+=flow;
	}
	return maxflow;
}
signed main() {
	ios::sync_with_stdio(false);
	cin>>n>>m>>e;
	s=1,t=n+m+2;
	for(int i=1; i<=n; i++) {
		add(s,i+1,1);
		add(i+1,s,0);
	}
	for(int i=1; i<=e; i++) {
		int u,v;
		cin>>u>>v;
		u=u+1,v=v+n+1;
		add(u,v,1);
		add(v,u,0);
	}
	for(int i=1; i<=m; i++) {
		add(i+n+1,t,1);
		add(t,i+n+1,0);
	}
	cout<<Dinic()<<"\n";
	return 1+1==3;
}
posted @ 2023-06-09 18:54  N0zoM1z0  阅读(2)  评论(0编辑  收藏  举报