L2-1 分而治之 (25分)
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<map> #include<set> #include<queue> #include<iomanip> #include<stack> using namespace std; #define STDIN freopen("in.in", "r", stdin);freopen("out.out", "w", stdout); const int N = 10000; int h[N], e[N<<1], ne[N<<1], idx; int n, m; void add(int a, int b) { e[idx] = b; ne[idx] = h[a]; h[a] = idx++; } bool solve(set<int> &se) { for (int k = 1; k <= n; k++) { if (se.find(k) == se.end()) for (int i = h[k]; ~i; i = ne[i]) { int j = e[i]; if (se.find(j) == se.end()){ return false; } } } return true; } int main() { // STDIN cin >> n >> m; for (register int i = 0; i <= n; i++) h[i] = -1; for (register int i = 1; i <= m; i++) { int a, b; scanf("%d%d", &a, &b); add(a, b), add(b, a); } int k; cin >> k; for (register int i = 1; i <= k; i++) { set<int> se; int t; cin >> t; for (register int i=1; i<= t;i++) { int x; scanf("%d", &x); se.insert(x); } if (solve(se)) puts("YES"); else puts("NO"); } }