题目链接: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; }