题意:
DAG图里面求一个最小边覆盖
最少不相交路径覆盖=原图的点数-新图的最大匹配
#include <bits/stdc++.h>
using namespace std;
#define se second
#define fi first
#define ll long long
#define pb push_back
#define CLR(a,b) memset(a,(b),sizeof(a))
const int MAXN = (int)1e4+10;
vector<int> E[MAXN];
bool used[MAXN];
int bl[MAXN];
bool find(int u) {
for(int i = 0; i < (int)E[u].size(); ++i) {
int v = E[u][i];
if(!used[v]) {
used[v] = true;
if(bl[v]==0 || find(bl[v])) {
bl[v] = u;
return true;
}
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
int n, m, k, T;
cin >> T;
while(T--) {
cin >> n >> m;
CLR(bl, 0);
for(int i = 0; i <= n; ++i) E[i].clear();
for(int i = 1; i <= m; ++i) {
int u, v;
cin >> u >> v;
E[u].pb(v);
}
int ans = 0;
for(int i = 1; i <= n; ++i) {
CLR(used, false);
if(find(i)) ans++;
}
cout << n-ans << endl;
}
return 0;
}