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

posted @ 2024-11-21 17:38  5k_sync_closer  阅读(46)  评论(6编辑  收藏  举报