这个题如果开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");
}
}
这篇博客探讨了在处理大型图结构时,使用邻接矩阵可能导致的内存问题。作者通过开一个哈希映射来替代传统的二维数组,以减少内存消耗。哈希函数为a*10000+b,这种方法在处理节点数量超过1000*1000的图时,可以有效降低内存占用。博客中还提供了一个C++代码示例,展示了如何使用哈希映射实现并检查图的某些性质。
331

被折叠的 条评论
为什么被折叠?



