poj 图相关之3041 Asteroids
第一次接触匈牙利算法,可以参考博客:
http://blog.csdn.net/dark_scope/article/details/8880547
而这道题把每一个坐标的横纵坐标看做是二分图的左右两边,问题就转化为了求最小点覆盖数=最大匹配数
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXNUM 505
using namespace std;
bool map[MAXNUM][MAXNUM], vis[MAXNUM];
int link[MAXNUM], N, K, ans;
bool dfs(int x)
{
int i, j;
for (i = 1; i <= N; i++)
{
if (!vis[i] && map[x][i])
{
vis[i] = 1;
if (link[i] == 0 || dfs(link[i]))
{
link[i] = x;
return true;
}
}
}
return false;
}
void search(void)
{
int i, j;
for (i = 1; i <= N; i++)
{
memset(vis, 0, sizeof(vis));
if (dfs(i))
ans++;
}
}
int main(void)
{
int i, j, a, b;
scanf("%d%d", &N, &K);
memset(map, 0, sizeof(map));
memset(link, 0, sizeof(link));
for (i = 0; i < K; i++)
{
scanf("%d%d", &a, &b);
map[a][b] = true;
}
ans = 0;
search();
printf("%d\n", ans);
}