您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: