看完题就会做。。裸的二分图匹配。。直接上匈牙利。。将问题向锦囊连边。。还有并查集做法。
匈牙利:
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
int i,j,n,m,to[1005][5],pre[1005],u[1005];
bool find(int x)
{
for (int i=1;i<=2;i++)
if (!u[to[x][i]])
{
u[to[x][i]]=1;
if (pre[to[x][i]]==-1||find(pre[to[x][i]]))
{
pre[to[x][i]]=x;
return true;
}
}
return false;
}
int hungary(int n)
{
memset(pre,-1,sizeof(pre));
for (int i=1;i<=n;i++)
{
memset(u,0,sizeof(u));
if (!find(i)) return i-1;
}
return n;
}
int main()
{
scanf("%d%d",&m,&n);
for (i=1;i<=n;i++)
scanf("%d%d",&to[i][1],&to[i][2]);
cout<<hungary(n);
}