二分匹配,你把横的竖的分别写在两列,重叠的之间连线,然后就构成了二分图,然后所以的个数减去最大匹配数即可。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; bool p[1005][1005]; int l[1005]; bool v[1005]; int mx[1005],my[1005],nx[1005],ny[1005]; int m,n,ans; bool go(int x) { for(int i=1;i<=n;i++) { if(p[x][i]==1&&v[i]==0) { v[i]=1; if(l[i]==0||go(l[i])) { l[i]=x; return true; } } } return false; } int main() { while(scanf("%d%d",&m,&n)&&(n||m)) { memset(p,0,sizeof(p)); memset(l,0,sizeof(l)); for(int i=1;i<=m;i++) { scanf("%d%d",&mx[i],&my[i]); } for(int i=1;i<=n;i++) { scanf("%d%d",&nx[i],&ny[i]); for(int j=1;j<=m;j++) { if((my[j]==ny[i]||my[j]==ny[i]+1)&&(mx[j]==nx[i]||mx[j]+1==nx[i])) { p[j][i]=1; } } } ans=0; for(int i=1;i<=m;i++) { memset(v,0,sizeof(v)); if(go(i))ans++; } cout<<m+n-ans<<endl; } return 0; }