• STL中vector怎么实现邻接表


    最近,同期的一位大佬给我出了一道题目,改编自 洛谷 P2783 有机化学之神偶尔会做作弊

    这道题好坑啊,普通链表过不了,只能用vector来存边。可能更快一些吧?

    所以,我想记录并分享一下vector怎么实现邻接表。

    I:存边

    通常我们用的链表结构需要自己打一个add函数

    int cnt,head[maxn];
    
    struct edge {
        int next,to,cost;
    } e[maxn];
    
    void add(int a,int b,int c)
    {
        e[++cnt].to=b;e[cnt].cost=c;
        e[cnt].next=head[a];head[a]=cnt;
    } 

    但是,vector来存储就不需要这么复杂。我们还是要一个结构体,但是不需要用e.next和head[]数组。

    然后,我们要明确vector数组的下标是什么。请看代码中详解。

    struct edge {
        int to,cost;
    };
    
    vector <edge> e[maxn];//表示以i为起点的所有边
    //p.s. 此时定义的看似是一维数组,实际上是有两个维度
    //例如 e[x][i].to 表示的是以x为起点,第i条边的to。
    
    //而 存边就是这样 在main函数里直接:
    int t;edge f;
    scanf("%d%d%d",&t,&f.to,&f.cost);
    e[t].push_back(f);

    II:遍历

    遍历十分简单,直接一遍循环,找e[x]这个数组里面的所有边。

    这里我们要用到一个函数 e[x].size() 表示数组大小。

    //假设遍历到了x点
    for (int i=0;i<s[x].size();i++) {
        int from=s[x][i].to;//这是与x点相连的i边的to
        int w=s[x][i].cost;//同理 这是cost
    }

    就这样 vector就可以实现邻接表了。

    是不是比链式前向星更加简洁呢?

  • 相关阅读:
    开学测试感想
    动手动脑1(00JAVA语言基础)
    9.29 java web注释方式以及servlet映射
    三十道随机算法
    9.30 servlet学习
    C#验证控件的使用方法
    SqlHelper详解
    C#字符串的几种常用方法
    存储过程事务处理
    js url编码
  • 原文地址:https://www.cnblogs.com/fushao2yyj/p/8530944.html
Copyright © 2020-2023  润新知