二分图匹配模板

https://www.luogu.org/problem/P3386

#include<cstdio>
#include<vector>
using namespace std;
vector<int>e[2005];
int vis[2005];
int t;
int link[2005];
int find(int x)
{
	for(int i=0;i<e[x].size();i++)
	{
		int y=e[x][i];
		if(vis[y]!=t)
		{
			vis[y]=t;
			if(link[y]==0||find(link[y]))
			{
				link[y]=x;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int n,m,q;
	scanf("%d%d%d",&n,&m,&q);
	while(q--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		if(x<1||x>n||y<1||y>m)continue; 
		e[x].push_back(y);
		//e[y].push_back(x);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		t++;
		if(find(i))
		{
			ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2019-08-07 15:51  ShineEternal  阅读(164)  评论(0编辑  收藏  举报