HDU 4619 Warm up 2(点独立集)
2015-04-02 19:11
363 查看
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <set> #include <map> #include <queue> #include <stack> #define LL long long #define FOR(i, x, y) for(int i=x;i<=y;i++) using namespace std; const int MAXN = 2000 + 10; struct Point { int x, y; }A[MAXN], B[MAXN]; int match[MAXN]; int vis[MAXN]; int n, m; struct Edge { int to; int next; }edge[MAXN]; int head[MAXN]; int tot; void AddEdge(int u, int v) { edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++; } int path(int u) { for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].to; if(!vis[v]) { vis[v] = 1; if(match[v] == -1 || path(match[v])) { match[v] = u; return 1; } } } return 0; } int main() { while(scanf("%d%d", &n, &m)!=EOF) { if(n == 0 && m == 0) break; for(int i=1;i<=n;i++) scanf("%d%d", &A[i].x, &A[i].y); for(int i=1;i<=m;i++) scanf("%d%d", &B[i].x, &B[i].y); memset(head, -1, sizeof(head)); tot = 0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { int x1 = A[i].x; int y1 = A[i].y; int x2 = B[j].x; int y2 = B[j].y; if((x1 == x2 && y1 == y2) || (x1 == x2 && y1 == y2 + 1) || (x1 + 1 == x2 && y1 == y2) || (x1 + 1 == x2 && y1 == y2 + 1)) AddEdge(i, j); } } int ans = 0; memset(match, -1, sizeof(match)); for(int i=1;i<=n;i++) { memset(vis, 0, sizeof(vis)); ans += path(i); } printf("%d\n", n + m - ans); } return 0; }
相关文章推荐
- HDU 4619 Warm up 2 最大独立集
- hdu 4619 Warm up 2_最大独立集
- hdu 4619 Warm up 2_最大独立集
- HDU 4619 Warm up 2 最大独立集
- HDU 4619 Warm up 2(贪心、并查集 | 二分图最大独立集)
- hdu 4619 Warm up 2 (二分图最大独立集)
- HDU 4619 Warm up 2(最大独立集)
- hdu 4619 Warm up 2(KM)
- hdu 4619 Warm up 2(最大独立点集,二分匹配,4级)
- hdu 4619 Warm up 2 二分图匹配
- hdu - 4619 - Warm up 2
- HDU 4619 Warm up 2 (2013 多校第二场) - from lanshui_Yang
- HDU 4619 Warm up 2 (二分图最小覆盖集)
- HDU 4619 Warm up 2 (并查集)
- HDU-4619-Warm up 2
- HDU 4619 Warm up 2
- HDU - 4619 I - Warm up 2
- hdu 4619 Warm up 2
- HDU 4619 Warm up 2(2013多校2 1009 二分匹配)
- hdu 4619 Warm up 2(并查集)