• 【学习】小蒟蒻学了半天不理解的东西——链式向前星


    前言

    小蒟蒻实在是太菜了,看了好久都没看懂,最后在dalao的指导下才终于理解了它

    关于链式向前星和他的兄弟姐妹

    链式向前星等价于邻接表,即用数组模拟邻接表来存图

    和它相像的还有前向星链式前向星,这两个前向星好像跟邻接表有些许的不同 吧 而且用的好像不多?(由于不是重点,有兴趣的话可以自行百度)

    小蒟蒻也不知道他们究竟一不一样,有大佬懂的话欢迎指正

    毕竟我在某度上搜这三个词出现的搜索结果不一样的说

    先上代码

    struct node{

        int to,w,next;    //e[i].to是第i条边指向的那个点

                          //e[i].next是emmm我也解释不清楚,看图吧

                          //e[i].w是边权 这里不涉及

    }e[200001];

    int head[100001],cnt_edge;    //head是表头,即最后加入的点

    void add(int from,int to,int w){      //加边

        e[++cnt].to=to;e[cnt].w=w;e[cnt].next=head[from];head[from]=cnt;

    }

    memset(head,-1,sizeof(head));

    大家肯定都看不懂因为我当时就没看懂

    存图当然要画图解释啦

    读入一张图

    1 4
    1 3
    3 4
    2 3

    画出来就是这个样子,红色的数字是读入边的顺序,也就是cnt_edge 

    下面的图就清晰多了

    Q1:为什么head[1]=0,后来head[1]=1呢?

    A1:因为第一次加边时,只有-1 <- 4,这时1的head值,即最后面的一条边,就是0,再加一条边后最后面就变成了4 <- 3,所以head[1]就被更新成1了

    Q2:edge[0].next为什么是-1?

    A2:因为head[]被初始化为-1了

    Q3:那为什么edge[1].next=0呢?

    A3:

    看图中蓝色的线,是不是一目了然,不用解释了吧

    结束了

    现在再看这段代码是不是清晰多了

    struct node{
        int to,w,next;    //e[i].to是第i条边指向的那个点
                          //e[i].next是emmm我也解释不清楚,看图吧
                          //e[i].w是边权 这里不涉及
    }e[200001];
    int head[100001],cnt_edge;    //head是表头,即最后加入的点
    void add(int from,int to,int w){      //加边
        e[++cnt].to=to;e[cnt].w=w;e[cnt].next=head[from];head[from]=cnt;
    }
    memset(head,-1,sizeof(head));
  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/gengyf/p/10804393.html
Copyright © 2020-2023  润新知