当前位置: 首页 > news >正文

前向星和链式前向星

前向星和链式前向星


 

1、前向星

       前向星是以存储边的方式来存储图,先将边读入并存储在连续的数组中,然后按照边的起点进行排序,这样数组中起点相等的边就能够在数组中进行连续访问了。它的优点是实现简单,容易理解,缺点是需要在所有边都读入完毕的情况下对所有边进行一次排序,带来了时间开销,实用性也较差,只适合离线算法。 图一-2-4展示了图一-2-1的前向星表示法。

 


 

2、链式前向星(就是数组模拟链表)

 链式前向星和邻接表类似,也是链式结构和线性结构的结合,每个结点i都有一个链表,链表的所有数据是从i出发的所有边的集合(对比邻接表存的是顶点集合),边的表示为一个四元组(u, v, w, next),其中(u, v)代表该条边的有向顶点对,w代表边上的权值,next指向下一条边。
      具体的,我们需要一个边的结构体数组 edge[MAXM],MAXM表示边的总数,所有边都存储在这个结构体数组中,并且用head[i]来指向 i 结点的第一条边。
       边的结构体声明如下:
    struct EDGE {
                    int u, v, w, next;
        EDGE() {}
        EDGE(int _u, int _v, int _w, int _next) {
            u = _u, v = _v, w = _w, next = _next;
        }
    }edge[MAXM];
       初始化所有的head[i] = INF,当前边总数 edgeCount = 0
       每读入一条边,调用addEdge(u, v, w),具体函数的实现如下:
    void addEdge(int u, int v, int w) {
        edge[ edgeCount ] = EDGE(u, v, w, head[u]);
        head[u] = edgeCount ++;
    }
       这个函数的含义是每加入一条边(u, v),就在原有的链表结构的首部插入这条边,使得每次插入的时间复杂度为O(1),所以链表的边的顺序和读入顺序正好是逆序的。这种结构在无论是稠密的还是稀疏的图上都有非常好的表现,空间上没有浪费,时间上也是最小开销。
       调用的时候只要通过head[i]就能访问到由 i 出发的第一条边的编号,通过编号到edge数组进行索引可以得到边的具体信息,然后根据这条边的next域可以得到第二条边的编号,以此类推,直到next域为INF(这里的INF即head数组初始化的那个值,一般取-1即可)。
 

 

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/7508063.html

相关文章:

  • 开源PaaS Rainbond v3.7.0-rc1版本更新,系统生产稳定性大幅提升
  • zabbix3.0.4监控linux主机cpu使用率超过90%的时候报警
  • corosync + pacemaker +mysql +nfs
  • Java+大数据开发——Hadoop集群环境搭建(二)
  • python 循环列表的同时做删除操作
  • Mysql中数据类型括号中的数字代表的含义
  • python 正则匹配字母数字中的任意数字,字母
  • 大保健就是做公益?马云的一招让这个特殊群体赞不绝口
  • 儿童做家务年龄对照表,80%的父母都后悔看晚了…
  • Windows Embedded Standard CTP发布!
  • 阿布扎比有一个“智慧港口”
  • 4000余台ElasticSearch服务器遭PoS恶意软件感染
  • Docker for Mac配置Sock5代理
  • Vue.js 上传文件(后台使用.net)
  • 微商新手如何选产品?史上最详细操作指南!
  • ES6指北【2】—— 箭头函数
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 30秒的PHP代码片段(1)数组 - Array
  • 4. 路由到控制器 - Laravel从零开始教程
  • Apache的80端口被占用以及访问时报错403
  • Apache的基本使用
  • C++入门教程(10):for 语句
  • es6
  • gf框架之分页模块(五) - 自定义分页
  • JS专题之继承
  • python学习笔记 - ThreadLocal
  • Redux 中间件分析
  • spring boot 整合mybatis 无法输出sql的问题
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • ubuntu 下nginx安装 并支持https协议
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 构造函数(constructor)与原型链(prototype)关系
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 强力优化Rancher k8s中国区的使用体验
  • 区块链共识机制优缺点对比都是什么
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​马来语翻译中文去哪比较好?
  • #Linux(帮助手册)
  • #pragma once与条件编译
  • (C语言)fgets与fputs函数详解
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (十一)c52学习之旅-动态数码管
  • (转)四层和七层负载均衡的区别
  • (转载)从 Java 代码到 Java 堆
  • .gitignore文件---让git自动忽略指定文件
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)