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;

}

你可能感兴趣的:(poj)