zoukankan      html  css  js  c++  java
  • 【学习】小蒟蒻学了半天不理解的东西——链式向前星

    前言

    小蒟蒻实在是太菜了,看了好久都没看懂,最后在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));
  • 相关阅读:
    springmvc入门详解
    getClass 与getSimpleName
    mybati的存储过程
    mybatis与spring的整合
    mybatis分页插件以及懒加载
    mybatis知识总结
    【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
    【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
    【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    【Java面试题】27 多线程笔试面试概念问答
  • 原文地址:https://www.cnblogs.com/gengyf/p/10804393.html
Copyright © 2011-2022 走看看