zoukankan      html  css  js  c++  java
  • 图的存储结构(邻接表) 数据结构和算法57

    图的存储结构(邻接表)

     

    让编程改变世界

    Change the world by program


     

    邻接表(无向图)

      邻接矩阵看上去是个不错的选择,首先是容易理解,第二是索引和编排都很舒服~ 但是我们也发现,对于边数相对顶点较少的图,这种结构无疑是存在对存储空间的极大浪费。 [caption id="attachment_2524" align="alignnone" width="600"]邻接表(有向图) 邻接表(有向图)[/caption]   因此我们可以考虑另外一种存储结构方式,例如把数组与链表结合一起来存储,这种方式在图结构也适用,我们称为邻接表(AdjacencyList)。   邻接表的处理方法是这样:
    1. 图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。
    2. 图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择用单链表来存储。
      [caption id="attachment_2525" align="alignnone" width="600"]邻接表(无向图) 邻接表(无向图)[/caption]  

    邻接表(有向图)

      若是有向图,邻接表结构也是类似的,我们先来看下把顶点当弧尾建立的邻接表,这样很容易就可以得到每个顶点的出度: 邻接表(有向图)   但也有时为了便于确定顶点的入度或以顶点为弧头的弧,我们可以建立一个有向图的逆邻接表: 邻接表(有向图)   此时我们很容易就可以算出某个顶点的入度或出度是多少,判断两顶点是否存在弧也很容易实现。  

    邻接表(网)

      对于带权值的网图,可以在边表结点定义中再增加一个数据域来存储权值即可: [caption id="attachment_2529" align="alignnone" width="600"]邻接表(网) 邻接表(网)[/caption]  

    代码实现

    作为一个课后作业给大家自己锻炼下,小甲鱼提供的参考答案仅供参考借鉴:参考代码 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwJNUADo5IRR55b']视频下载[/Downlink]
  • 相关阅读:
    面试题15:链表中倒数第K个结点
    面试题31:连续子数组的最大和
    数据库索引实例
    面试题27:二叉搜索树与双向链表
    面试题28:字符串的排列
    java比较器Comparable接口和Comaprator接口
    面向对象知识汇总
    虚函数与纯虚函数
    Linux IO实时监控iostat命令详解
    hive GroupBy操作(翻译自Hive wiki)
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3847308.html
Copyright © 2011-2022 走看看