zoukankan      html  css  js  c++  java
  • 链式前向星

    链式前向星是一种非常常见且高效的一种存图方法,在LCA/SPFA等算法中很常用orz,由于我太弱了所以说需要写一篇博客来说服自己理解它的用法

    需要申明的数组

    End[i]:第i号边指向的点
    Len[i]:第i号边的长度
    Next[i]:跟第i号边有 相同起点上一条边 的编号
    Last[ x ]:以x为起点的 最新 一条边的编号

    1.在End[i]、Next[i]和Len[i]中,i表示的是第i号
    而在Last[x]中,x表示的是第x号
    2.在Next[i]和Last[x]中存的是 的编号,
    而在End[i]中存的是 的编号;
    3.边的编号由输入顺序决定,点的编号由输入数据决定;
    4.此处均以有向图讨论,无向图只需要将一条边拆分成两条有向边来存即可;
    5.所有数组的初值均可赋为0;


    存图代码

    //输入n,下面n行输入三个数字,x,y,z,表示从x到y有一条长度为z的边
        scanf("%d", &n);
        for(int i = 1; i <= n; i ++){
        scanf("%d%d%d", &x, &y, &z);
        End[i] = y;//注意驼峰命名法
        Len[i] = z;
        Next[i] = Last[x];//注意此行与下一行的顺序
        //因为Last[i]存的是以x为起点的上一条最新的边,所以此时以x为起点是上一条边 == 目前的Last[x]
        Last[x] = i;//更新,保证Last[i]始终存的是最新一条边的编号
    

    输出从点x出发的边

        int i = Last[x];//找到最新的一条以x为起点的边
        while(i){//如果有以x为起点的边,则i != 0,则循环继续
        printf("%d %d %d
    ", x, End[i], Len[i]);//输出起点,终点,长度
        i = Next[i];//将i更新为同i一个起点的上一条边,直到 i == 0(没有上一条边,循环结束)
        //若i != 0,则循环继续
        }
    

    ps:我算是明白了,每个写题解或者介绍算法的人心里都想着,我已经介绍得这么清楚了,不可能有人还不知道是怎么回事吧。
    然后看题解的人永远是一脸懵逼,这都是些啥跟啥啊。
    我建议构造一组数据自己手动模拟一下,或者尝试自己给别人讲清楚,尝试教会别人,那么不管别人懂没懂,你自己肯定是不会有问题的了orz【被拖出去打死】

  • 相关阅读:
    git创建远程分支
    npm 设置淘宝镜像的两个方法
    webpack + ts 项目的初始化
    react组件间事件触发的两种方式
    PhpStorm 使用 xdebug 进行调试(三)
    PhpStorm 使用 Apache 运行 php 代码(二)
    搭建 PHP 开发环境(Apache + PHP)(一)
    Centos7 安装 MongoDB
    Vue 中使用 vuex(十三)
    Vue 中使用 vue-router(十二)
  • 原文地址:https://www.cnblogs.com/qwqq/p/10530462.html
Copyright © 2011-2022 走看看