并查集
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int map[110][110];
int father[2100];
int vis[2100];
int getfather(int x)
{
while(father[x]!=-1)
{
x=father[x];
}
return x;
}
void Union(int x,int y)
{
int fx=getfather(x);
int fy=getfather(y);
if(fx!=fy)
father[fx]=fy;
}
int main()
{
int n,m;
int x,y;
while (~scanf("%d%d",&n,&m)&&n+m)
{
memset(map,0,sizeof(map));
memset(father,-1,sizeof(father));
memset(vis,0,sizeof(vis));
for (int i = 1; i <= n; i++)
{
scanf("%d%d",&x,&y);
map[x][y]=i;
}
for (int i = n+1; i <= n+m; i++)
{
scanf("%d%d",&x,&y);
if (map[x][y])
Union(map[x][y],i);
if (x>0&&map[x-1][y])
Union(map[x-1][y],i);
y++;
if (map[x][y])
Union(map[x][y],i);
if (x>0&&map[x-1][y])
Union(map[x-1][y],i);
}
for(int i=1;i<=n+m;i++)
vis[getfather(i)]++;
int ans=0;
for(int i=1;i<=n+m;i++)
ans+=vis[i]/2;
ans=n+m-ans;
printf("%d\n",ans);
}
return 0;
}