只能 60 分,第二个和第四个点 WA
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
void pre() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#define DEBUG(A) cout << A << endl
#else
#define DEBUG(A)
#endif
}
#define N 1001000
struct edge {
int nxt;
int v, fl;
};
vector<edge> g;
int head[N];
int tot = 0;
inline void adde(int u, int v, int fl) {
g.push_back({ head[u], v, fl });
head[u] = tot++;
}
int dep[N];
bool bfs(int s, int t) {
memset(dep, 0, sizeof(dep));
queue<int> q;
q.push(s);
dep[s] = 1;
while (q.size()) {
int u = q.front();
q.pop();
for (int i = head[u]; i != -1; i = g[i].nxt) {
// DEBUG("nxt");
int v = g[i].v;
int fl = g[i].fl;
if (fl != 0 && dep[v] == 0) {
dep[v] = dep[u] + 1;
q.push(v);
}
}
}
return dep[t] != 0;
}
int dfs(int u, int in, int t) {
if (u == t) {
return in;
}
int out = 0;
for (int i = head[u]; i != -1 && in != 0; i = g[i].nxt) {
int v = g[i].v;
int fl = g[i].fl;
if (dep[v] == dep[u] + 1 && fl != 0) {
int res = dfs(v, min(in, fl), t);
in -= res;
out += res;
fl -= res;
g[i].fl -= res;
g[i ^ 1].fl += res;
}
}
if (out == 0) {
dep[u] = 0;
}
return out;
}
int dinic(int s, int t) {
int ret = 0;
while (bfs(s, t)) {
DEBUG("bfs");
ret += dfs(s, 0x3f3f3f3f, t);
}
return ret;
}
signed main() {
pre();
/*code here*/
int T;
cin >> T;
while (T--) {
memset(head, -1, sizeof(head));
tot = 0;
g.clear();
int m, n;
cin >> m >> n;
int s = n + m + 1;
int t = n + m + 2;
for (int i = 1; i <= m; i++) {
adde(s, i, 1);
adde(i, s, 0);
}
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
for (int j = 1; j <= k; j++) {
int u;
cin >> u;
adde(u, i + m, 1);
adde(i + m, u, 0);
}
}
for (int i = 1; i <= n; i++) {
adde(i + m, t, 1);
adde(t, i + m, 0);
}
DEBUG("ok");
int ans = dinic(s, t);
if (ans >= n) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}