构图方式如下:

  以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;
}

相关文章: