POJ 1422 Air Raid(二分图匹配最小路径覆盖)
POJ 1422 Air Raid
题意:给定一个有向图,在这个图上的某些点上放伞兵,能够使伞兵能够走到图上全部的点。且每一个点仅仅被一个伞兵走一次。问至少放多少伞兵
思路:二分图的最小路径覆盖,每一个点拆成两个点,然后依据有向边连边,然后答案为n - 最大匹配数
代码:
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int N = 125; int t, n, m; vector<int> g[N]; int left[N], vis[N]; bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) continue; vis[v] = 1; if (!left[v] || dfs(left[v])) { left[v] = u; return true; } } return false; } int hungary() { int ans = 0; memset(left, 0, sizeof(left)); for (int i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if (dfs(i)) ans++; } return ans; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) g[i].clear(); int u, v; while (m--) { scanf("%d%d", &u, &v); g[u].push_back(v); } printf("%d\n", n - hungary()); } return 0; }