都什么年代还在用 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 快很多?