zoukankan      html  css  js  c++  java
  • 14 图的基础知识-几种常用的存储结构

    时间有点紧 没时间接着更了。。考完研回头再写吧


    一、邻接矩阵
    1、描述:用一维数组存储图顶点的信息
    用二维数组存储图边的信息
    2、特点:
    ①无向图的邻接矩阵:
     是唯一的对称矩阵,可以压缩存储(仅存储上/下三角);
     第i行(列)非零元素为第i个顶点的度
    ②有向图的邻接矩阵:
     第i行(列)的非零元素为第i个顶点的出度(入度);
    ③邻接矩阵的局限性:要确定多少边必须按行列检测,花费时间的代价很大。
    ④用于确定两点之间是否有边非常方便
    ⑤设图G邻接矩阵为A,A的n次方元素A^n[i][j]等于由顶点i~j长度为n的路径的数目
     适用:存储稠密图
     空间复杂度:O(n²);其中n为图顶点数|V|
    3、存储结构定义

    1 #define maxVertexnum 100
    2 typedef struct{
    3 int V[maxVertexnum];//顶点表
    4 int edge[maxVertexnum][maxVertexnum];//边表
    5 int vexnum,arcnum;//当前顶点数,弧数
    6 }Mgraph;


    二、邻接表
    1、描述:对于图G中每个顶点建一个单链表(顶点表结点),第i个单链表中结点表示依附vi的边(边表结点)
    2、特点:
    ①无向图需要的存储空间:O(|V|+2|E|)//无向图中每个边在表中出现2次
      有向图需要的存储空间:O(|V|+|E|)
    ②稀疏图用这个存储贼省空间!
    ③优:查一个点有几个关系边很方便
      缺:查入度需要遍历整个表(麻烦),判断两个顶边之间是否存在边效率低
    ④表示不唯一

    3、存储结构定义:

     1 #define maxVertexnum 100
     2 /*边表结点*/
     3 typedef struct ArcNode{
     4 int adjvex; //表示弧指向的顶点位置
     5 struct ArcNode *next;//指向下一条弧的指针
     6 }ArcNode;
     7 /*顶点表结点*/
     8 typedef struct VNode{
     9 VertexType data; //顶点信息
    10 ArcNode *first;//指向第一个依附该顶点的弧的指针
    11 }VNode,AdjList[maxVertexnum];
    12 /*临接表*/
    13 typedef struct{
    14 AdjList vertex; //邻接表
    15 int vexnum,arcnum;//图的顶点数与弧数
    16 }ALGraph



    三、十字链表【针对有向图】
    描述:一种链式存储的结构。
    1、特点:
    ①每一条边用一个结点表示
    ②顶点之间是顺序存储
    ③很容易求顶点出度与入度
    ④表示不唯一,但唯一确定一个图
           
    2、组成:
    弧结点:尾域tailvex/头域headvex/链域hlink(指向弧头相同的下一条弧)/尾域tlink(指向弧尾相同的下一条弧)/数据域(data)

    光描述有点抽象 上个图

    3、存储结构定义

     1 #define maxVertexNum 100
     2 /*边表结点*/
     3 typedef struct ArcNode{
     4 int tailvex,headvex;//弧的头尾结点
     5 struct ArcNode *hlink,*tlink;//分别指向弧头弧尾相同的结点
     6 int data;
     7 }ArcNode;
     8 /*顶点表*/
     9 typedef struct VNode{
    10 VertexType data;//顶点信息
    11 ArcNode *firstin,*firstout;//指向第一条入弧和出弧
    12 }VNode;
    13 /*邻接表*/
    14 typedef struct{
    15 VNode xlist[maxVertexNum];//邻接表
    16 int vexnum,arcnum;//记录图的顶点数与弧数
    17 }GLGraph;



    四、邻接多重表【针对无向图】


    描述:为了解决邻接表判断两顶点之间是否存在边或者需要对边执行删除操作效率低的问题而诞生
          所有依附于同一顶点的边串联在同一链表中
    1、特点:
    ①每条边只有一个结点
    ②每个边结点同时连接在两个链表中

    二、组成:
    边结点:
            mark(标识域,用于标记该边是否被搜索过。)
            ivex/jvex(该边依附的两顶点在图中的位置)
            ilink/jlink(指向下一条依附于顶点ivex/jvex的边)
            data/(数据域)

    上个图

    三、存储结构定义

     1 #define maxVertexNum 100
     2 /*边表结点*/
     3 typedef struct ArcNode{
     4 bool mark; //访问标记
     5 int ivex,jvex;//分别指向该弧的两个结点
     6 struct ArcNode *hlink,*tlink;//分别指向弧头弧尾相同的结点
     7 int data;
     8 }ArcNode;
     9 /*顶点表*/
    10 typedef struct VNode{
    11 VertexType data;//顶点信息
    12 ArcNode *firstedge;//指向第一条依附该顶点的边
    13 }VNode;
    14 /*邻接表*/
    15 typedef struct{
    16 VNode adjmulist[maxVertexNum];//邻接表
    17 int vexnum,arcnum;//记录图的顶点数与弧数
    18 }AMLGraph;
  • 相关阅读:
    SharePoint提交前有效性验证
    showModalDialog/showModelessDialog弹出窗刷新例子
    在多选用户字段中查找是否存在某个用户(转自JianYi博客)
    SQL获得月第一天等
    SQL如何将Null不参与计算
    自定义Icon字段
    Backup Exec Remote Agent 在远程服务器上启动时挂起,一直显示Starting状态
    一个好用的日期控件My97DatePicker
    使用错误页统一处理错误(转)
    MS SQL游标的使用
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/7609152.html
Copyright © 2011-2022 走看看