邻接表
2024-11-09 18:47:33
发布于:浙江
邻接表
定义
邻接矩阵一定需要去开辟 的空间,当一个题目的顶点数量 在一个数组当中是无法开辟这么大的空间的。因此,我们需要使用邻接表来存储图的结构。
邻接表的优势
- 空间复杂度:对于一个有个顶点的图,条边的一张图,邻接表只需要的空间,其中是边的数量。
- 插入和删除操作:对于邻接表来说,插入和删除操作的时间复杂度都是。
- 稀疏图:对于一个稀疏图来说,邻接表的存储空间可以大大减少。
邻接表的实现
邻接表相当于是条链表的集合,每个链表存储了与某个顶点相连接的其他顶点。
比如,链表数组的名称为,对于顶点,指向一个链表,链表中存储了与相连接的其他顶点。
假如与点相连接的顶点有,那么中存储的就是。
如果需要储存权值,只需要将链表当中的每一个空间划分为两个部分,第一个部分存储顶点,第二个部分存储权值。
- 使用指针来去实现链表,构成一个邻接表。 动态链表的实现,删除和插入的操作都为O(1)。
- 使用vector来代表其中的链表,构成一个邻接表。 静态链表,删除操作为O(n),插入操作为O(1)。
// vecotr静态链表实现邻接表
struct Edge {
    int v;
    int w;
};
vecotr<Edge> mp[MAXN]; // 邻接表
mp[v].push_back(Edge{u, w}); // 插入边
// 动态链表实现邻接表
struct Node {
    int v;
    int w;
    Node* next;
};
Node* mp[MAXN]; // 邻接表
Node* head[MAXN]; // 头指针
int cnt[MAXN]; // 记录每个顶点的度
void addEdge(int u, int v, int w) {
    Node* node = new Node{v, w, head[u]};
    head[u] = node;
    cnt[u]++;
}
void delEdge(int u, int v) {
    Node* p = head[u];
    Node* pre = nullptr;
    while (p) {
        if (p->v == v) {
            if (pre) {
                pre->next = p->next;
            } else {
                head[u] = p->next;
            }
            delete p;
            cnt[u]--;
            return;
        }
        pre = p;
        p = p->next;
    }
}
这里空空如也






有帮助,赞一个