题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619
题解:水平多米若骨牌和竖直多米若骨牌有重叠连一条边,求最大独立集。
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 1002
using namespace std;
vector<int> mp[MAXN];
int from[MAXN],visited[MAXN];
int match(int x)
{
int i,temp,size;
size=mp[x].size();
for(i=0;i<size;++i)
{
temp=mp[x][i];
if(!visited[temp])
{
visited[temp]=1;
if(from[temp]==-1||match(from[temp]))
{
from[temp]=x;
return 1;
}
}
}
return 0;
}
int hungary(int n)
{
int i,sum=0;
memset(from,-1,sizeof(from));
for(i=0;i<n;++i)
{
memset(visited,0,sizeof(visited));
if(match(i))
++sum;
}
return sum;
}
int main()
{
int n,m,i,j,x1,y1,x2,y2,ans;
int hor[MAXN][2],ver[MAXN][2];
while(scanf("%d %d",&n,&m))
{
if((m+n)==0)
break;
for(i=0;i<n;++i)
{
scanf("%d %d",&ver[i][0],&ver[i][1]);
mp[i].clear();
}
for(i=0;i<m;++i)
{
scanf("%d %d",&hor[i][0],&hor[i][1]);
}
for(i=0;i<n;++i)
{
x1=ver[i][0];
y1=ver[i][1];
for(j=0;j<m;++j)
{
x2=hor[j][0];
y2=hor[j][1];
if((x1==x2&&y1==y2)
||(x1==x2&&y1==y2+1)
||(x1+1==x2&&y1==y2)
||(x1+1==x2&&y1==y2+1))
mp[i].push_back(j);
}
}
ans=n+m-hungary(n);
printf("%d\n",ans);
}
return 0;
}