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