思路:
这题是二分图最大匹配的模板题。
二分图的最大匹配:找一个二分图的最大匹配,选择尽量多的边,使任意两条选中的边没有公共点。(如果所有点都是匹配点,这个匹配就是完美匹配)。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 200200;
int head[maxn],nxt[maxn],vis[maxn],ver[maxn],tot=0,link[maxn];
void addedge(int u,int v){
ver[tot] = v;
nxt[tot] = head[u];
head[u] = tot++;
}
void Init(){
memset(head,-1,sizeof(head));
memset(nxt,-1,sizeof(nxt));
memset(link,-1,sizeof(link));
tot = 0;
}
bool dfs(int u){
for(int i=head[u];~i;i=nxt[i])
if(!vis[ver[i]]){
vis[ver[i]] = 1;
if(link[ver[i]]==-1||dfs(link[ver[i]])){
link[ver[i]] = u;
return true;
}
}
return false;
}
int main(void)
{
int n,m,k,i,j,x,y;
while(~scanf("%d",&k)&&k){
Init();
scanf("%d%d",&n,&m);
for(i=1;i<=k;i++){
scanf("%d%d",&x,&y);
y+=550;
addedge(x,y);
addedge(y,x);
}
int ans = 0;
for(i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",ans);
}
return 0;
}