这个题如果开vis[10000][10000]第三、四测试点过不去。利用hash,开一个map。hash函数:a * 10000 + b。思考:不可能每个节点之间都有关系,所以再1000 * 1000以上数量的节点的图,要占用(10^8 / 2^20)~= 95.3MB内存(这里是用bool的大小算的1B,int还要乘4),用邻接矩阵的话太大,太浪费了。
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, vector<int>> mp;
unordered_map<int, bool> vis;
int main() {
int n, m, k, a, b, x;
scanf ("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf ("%d %d", &a ,&b);
mp[a].push_back(b);
mp[b].push_back(a);
}
scanf ("%d", &k);
for (int i = 0; i < k; i++) {
int cnt = 0;
vis.clear();
scanf ("%d", &x);
for (int j = 0; j < x; j++) {
scanf ("%d", &a);
for (auto it : mp[a]) {
if (vis[a * 10000 + it] == false) {
cnt++;
vis[a * 10000 + it] = vis[it * 10000 + a] = true;
}
}
}
if (cnt == m) {
printf ("Yes\n");
continue;
}
printf ("No\n");
}
}