题意:横多米诺和竖多米诺不相交最多有多少个
/************************************************ Author :DarkTong Created Time :2016/8/1 21:45:12 File Name :Hdu_4619.cpp *************************************************/ #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; vector<int> w[maxn]; int n, m; int Left[maxn]; bool used[maxn]; bool match(int i) { for(int j=0;j<w[i].size();++j) if(!used[w[i][j]]) { int v = w[i][j]; used[v] = true; if(!Left[v]||match(Left[v])) { Left[v] = i; return true; } } return false; } //返回最大匹配数 int hungary() { int res=0; memset(Left, 0, sizeof(Left)); for(int i=1;i<=n;++i) { memset(used, 0, sizeof(used)); if(match(i)) res++; } return res; } int r[maxn][2]; int main() { int T, cas=1; while(scanf("%d%d", &n, &m)==2&&(n+m)) { for(int i=0;i<maxn;++i)w[i].clear(); int u, v; for(int i=1;i<=n;++i) scanf("%d%d", &r[i][0], &r[i][1]); for(int i=1;i<=m;++i) { scanf("%d%d", &u, &v); for(int j=1;j<=n;++j) { if(r[j][0]<=u&&u<=r[j][0]+1&&v<=r[j][1]&&r[j][1]<=v+1) { // printf("---%d %d\n", j, i); w[j].push_back(i); } } } printf("%d\n", n+m-hungary()); } return 0; }
时间: 2024-10-08 10:05:08