都什么年代还在用 vector 存图
众所周知 vector 常数比数组大,而且短 vector 常数比数组大很多,
但是有的时候 vector 不能直接用数组替代(比如存图),难道必须要写 vector 吗?
如果可以提前知道每个 vector 的大小(比如存图),可以考虑静态内存池。
具体地,开一个数组 P,把 P 分成若干段,分给每个要开的 vector 即可。
众所周知我是仙人掌那题卡了链式前向星,所以考虑静态内存池存图:
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, q, d[1050], L[1050], X[1050], u[100050], v[100050], P[200050];
bitset<1001> b[1001][1001];
int main()
{
scanf("%d%d%d", &n, &m, &q);
for (int i = 0; i < m; ++i)
scanf("%d%d", u + i, v + i), ++L[u[i]], ++L[v[i]];
for (int i = 1; i <= n; ++i)
L[i] += L[i - 1], X[i] = L[i - 1];
for (int i = 0; i < m; ++i)
P[++X[u[i]]] = v[i], P[++X[v[i]]] = u[i];
for (int s = 1; s <= n; ++s)
{
memset(d, -1, sizeof d);
b[s][d[s] = 0][s] = 1;
queue<int> q;
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = L[u - 1] + 1, v; i <= L[u]; ++i)
if (!~d[v = P[i]])
q.push(v), b[s][d[v] = d[u] + 1][v] = 1;
}
for (int i = 1; i <= n; ++i)
b[s][i] |= b[s][i - 1];
}
for (int i = 0, a, x, y; i < m; ++i)
{
scanf("%d", &a);
bitset<1001> q;
while (a--)
scanf("%d%d", &x, &y), q |= b[x][y];
printf("%d\n", q.count());
}
return 0;
}
可以看到并不是很难写,而且比 vector 略快(
而且应该可以构造数据使得这个东西比 vector 快很多?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具