二分图匹配求助
  • 板块题目总版
  • 楼主KυρωVixen
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/4/6 21:04
  • 上次更新2023/10/23 19:14:06
查看原帖
二分图匹配求助
765382
KυρωVixen楼主2023/4/6 21:04
#include<bits/stdc++.h>
using namespace std;
//defines
const int N=505,M=2005;
//data
int n1,n2,m;
//edge
int ecnt=1,hd[N];
struct edge{
	int nxt,v,w;
}e[M*2];
void addEdge(int u,int v,int w){
	e[++ecnt].v=v; e[ecnt].w=w; e[ecnt].nxt=hd[u]; hd[u]=ecnt;
}
void addedge(int u,int v,int w){
	addEdge(u,v,w); addEdge(v,u,0);
}
//maxf
int s,t,maxf,dis[N],now[N];
bool spfa(){
	queue<int>q;
	memset(dis,0,sizeof(dis)); dis[s]=1; q.push(s);
	while(!q.empty()){
		int u=q.front(); q.pop();
		for(int i=hd[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(!dis[v]&&e[i].w>0){
				dis[v]=dis[u]+1; q.push(v);
			}
		}
	}
	return dis[t];
}
int dinic(int u,int gx){
	if(u==t) return gx;
	int res=0;
	for(int &i=now[u];i&&gx;i=e[i].nxt){
		int k,v=e[i].v;
		if(dis[v]==dis[u]+1&&(k=dinic(v,min(e[i].w,gx)))){
			e[i].w-=k; e[i^1].w+=k; res+=k; gx-=k;
		}
	}
	return res;
}
void maxflow(){
	while(spfa()){
		memcpy(now,hd,sizeof(hd));
		maxf+=dinic(s,0x7ffffff);
	}
}
//main
signed main(){
	cin>>n1>>n2>>m;
	for(int i=0;i<m;i++){
		int l,r; cin>>l>>r;
		addedge(l,r+n1,1);
	}
	for(int i=1;i<=n1;i++) addedge(0,i,1);
	for(int i=1;i<=n2;i++) addedge(n1+i,n1+n2+1,1);
	s=0,t=n1+n2+1; maxflow();
	cout<<maxf<<endl;
}

网络流写法

2023/4/6 21:04
加载中...