http://acm.hdu.edu.cn/showproblem.php?pid=1151
题意为给出n个十字路口,m条单向边,求出最小路径覆盖
DAG图中最小路径覆盖=顶点数-最大匹配数
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200;
vector<int> E[maxn];
int link[maxn], vis[maxn];
bool dfs(int u) {
for(int i = 0; i < E[u].size(); ++i) {
int v = E[u][i];
if(vis[v]) continue;
vis[v] = 1;
if(link[v] == -1 || dfs(link[v])) {
link[v] = u;
return true;
}
}
return false;
}
int MaxMatch(int n) {
int res = 0;
memset(link, -1, sizeof(link));
for(int i = 1; i <= n; ++i) {
memset(vis, 0, sizeof(vis));
if(dfs(i)) res++;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--) {
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i) E[i].clear();
int u, v;
for(int i = 0; i < m; ++i) {
cin >> u >> v;
E[u].push_back(v);
}
cout << n - MaxMatch(n) << endl;
}
}