poj 3041 Asteroids 最小点覆盖
构图方式如下:
以row行号作为x集合顶点, col行号作为y集合顶点,根据题目给出的坐标x,y用边连接X,Y集合的顶点,求最小点覆盖数
#include <iostream>
using namespace std;
const int N = 505;
bool maze[N][N];
bool isvisit[N];
int match[N];
int n, k;
bool find(int u)
{
for (int i = 1; i <= n; i++)
{
if (maze[u][i] && !isvisit[i])
{
isvisit[i] = true;
if (!match[i] || find(match[i]))
{
match[i] = u;
return true;
}
}
}
return false;
}
int main()
{
int x, y;
memset(maze, false, sizeof(maze));
cin >> n >> k;
while (k--)
{
cin >> x >> y;
maze[x][y] = true;
}
int ans = 0;
memset(match, 0, sizeof(match));
for (int i = 1; i <= n; i++)
{
memset(isvisit, false, sizeof(isvisit));
if (find(i))
ans++;
}
cout << ans << endl;
return 0;
}
浙公网安备 33010602011771号