並查集
#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;}