图 - 图的存储结构 - 邻接表表示法(一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图 - 图的存储结构 - 邻接表表示法(一)相关的知识,希望对你有一定的参考价值。

参考技术A

  图的邻接表表示法

  图的邻接表表示法类似于树的孩子链表表示法 对于图G中的每个顶点v i 该方法把所有邻接于v i 的顶点v j 链成一个带头

  结点的单链表 这个单链表就称为顶点v i 的邻接表(Adjacency List)

   邻接表的结点结构

  ( )表结点结构

  ┌────┬───┐

  │adjvex │next │

  └────┴───┘

  邻接表中每个表结点均有两个域:

  ① 邻接点域adjvex

  存放与vi相邻接的顶点v j 的序号j

  ② 链域next

  将邻接表的所有表结点链在一起

  注意

  若要表示边上的信息(如权值) 则在表结点中还应增加一个数据域

  ( )头结点结构

  ┌────┬─────┐

  │vertex │firstedge │

  └────┴─────┘

  顶点v i 邻接表的头结点包含两个域

  ① 顶点域vertex

  存放顶点v i 的信息

  ② 指针域firstedge

  v i 的邻接表的头指针

  注意

  ① 为了便于随机访问任一顶点的邻接表 将所有头结点顺序存储在一个向量中就构成了图的邻接表表示

  ② 有时希望增加对图的顶点数及边数等属性的描述 可将邻接表和这些属性放在一起来描述图的存储结构

   无向图的邻接表

  对于无向图 v i 的邻接表中每个表结点都对应于与v i 相关联的一条边 因此 将邻接表的表头向量称为顶点表 将无向图的

  邻接表称为边表

  【例】对于无向图G 其邻接表表示如下面所示 其中顶点v 的边表上三个表结点中的顶点序号分别为 和 它们分别表示

  关联于v 的三条边(v v ) (v v )和(v v )

  

  注意

  n个顶点e条边的无向图的邻接表表示中有n个顶点表结点和 e个边表结点

   有向图的邻接表

  对于有向图 v i 的邻接表中每个表结点都对应于以v i 为始点射出的一条边 因此 将有向图的邻接表称为出边表

  【例】有向图G 的邻接表表示如下面(a)图所示 其中顶点v 的邻接表上两个表结点中的顶点序号分别为 和 它们分别表示从

  v 射出的两条边(简称为v 的出边) 和

  

  注意

  n个顶点e条边的有向图 它的邻接表表示中有n个顶点表结点和e个边表结点

   有向图的逆邻接表

  在有向图中 为图中每个顶点v i 建立一个入边表的方法称逆邻接表表示法

  入边表中的每个表结点均对应一条以v i 为终点(即射入v i )的边

  【例】G 的逆邻表如上面(b)图所示 其中v 的人边表上两个表结点 和 分别表示射人v 的两条边(简称为v 的入边) <v p=""> </v>

  1 ,v 0 >和 。Tw.wingWIt

  注意:

  n个顶点e条边的有向图,它的接表表示中有n个顶点表结点和e个边表结点。

lishixinzhi/Article/program/sjjg/201311/23847

数据结构与算法学习笔记 图

数据结构与算法学习笔记(8) 图

复习

文章目录

一.图的定义和基本术语

  • 图、无向图、有向图

  • 完全图

  • 稀疏图、稠密图、网、邻接、关联

  • 顶点的度
  • 有向树

  • 路径、路径长度、回路、简单路径、简单回路

  • 连通图

  • 权、网

  • 子图

  • 连通分量、极大连通子图、极小连通子图、生成树、生成森林

二.图的类型定义

三.图的存储结构

1.邻接矩阵

无向图的邻接矩阵

有向图的邻接矩阵

第i行:以结点 v i v_i vi为头,结点 v j ( j = 1 , 2 , 3 , . . . , n ) v_j(j=1,2,3,...,n) vj(j=1,2,3,...,n)为尾的弧

第i列:以结点 v i v_i vi为尾,结点 v j ( j = 1 , 2 , 3 , . . . , n ) v_j(j=1,2,3,...,n) vj(j=1,2,3,...,n)为头的弧

网(有权图)

邻接矩阵的存储表示

  • 用两个数组分别存储顶点表和邻接矩阵

创建邻接矩阵(以无向网为例)
  • 算法描述

邻接矩阵表示法的优缺点

  • 优点

  • 缺点

2.邻接表

链式存储结构

  • 头结点

  • 表结点

    adjacent 相邻的

vertex 顶点

arc 弧

  • adjvex:邻接点域,存放与 v i v_i vi邻接的顶点在表头数组中的位置

  • nextarc:链域,指示下一条边或弧

    如果每一条边还有权值的话,可以增加一个数据域

无向图的邻接表

  • 特点

    • 邻接表不唯一

      比如上面那个v1后面的3和1可以互换

    • 若无向图中有n个顶点、e条边,则其邻接表需n个头结点和2e个表结点,适宜存储稀疏图

    • 无向图中顶点 v i v_i vi的度为第i个单链表中的结点数

有向图的邻接表

  • 邻接表

  • 逆邻接表

建立邻接表的算法

  • 顶点的结点结构

    typedef struct VNode
    	VerTexType data;	//顶点信息
    	ArcNode * firstarc;	//指向第一条依附该顶点的边的指针
    VNode,AdjList[MVNum];	//AdjList表示邻接表类型
    

  • 边结点结构

    #define MVNum 100	//最大顶点数
    typedef struct ArcNode//边结点
    	int adjvex;		//该边所指向的顶点的位置
    	struct ArcNode * nextarc; //指向下一条边的指针	
        OtherInfo info;		//与边相关的信息
    ArcNode;
    
  • 图的结构定义

    typedef struct
    	AdjList vertices;		
    	int vexnum,arcnum;	//图的当前顶点数和弧数
    ALGraph;
    
    • 邻接表操作举例

用邻接表表示法创建无向网
  • 算法思想

  • 算法描述

邻接表优缺点

邻接表、邻接矩阵

3.十字链表(用于有向图)

4.多重邻接表(无向图的另一种链式存储结构)

四.图的遍历

  • 遍历定义

  • 遍历实质

    找每个顶点的邻接点的过程

1.深度优先搜索(DFS)

  • 算法思想

邻接矩阵实现深度优先搜索遍历

  • 算法描述

邻接表实现深度优先搜素

  • 算法效率分析

2.广度优先搜索(BFS)

  • 算法思想

  • 算法

    利用队列

  • 算法描述

    按广度优先非递归遍历连通图G

    void BFS(Graph G,int v)	//按广度优先非递归遍历连通图G
        cout<<v;
        visited[v] = true;		//访问第v个顶点
        InitQueue(Q);			//辅助队列Q初始化,置空
        EnQueue(Q,v);			//v进队
        while(!QueueEmpty(Q))	//队列非空
            DeQueue(Q,u);		//队头元素出队并置为u
            for(w = FirstAdjVex(G,u);w>=0; w = NextAdjVex(G,u,w))
                //NextAdjvex:找下一个顶点
                if(!visited[w])	//w为u的尚未访问过的邻接顶点
                    cout<<w;
                    visited[w]=true;	
                    EnQueue(Q,w);	//w进队
                
            
        
    //BFS
    
  • 算法效率分析

3.DFS与BFS算法效率比较

五.图的应用

1.最小生成树

①生成树概念回顾

  • 注:

    含n个顶点n-1条边的图不一定是生成树,如:

无向图的生成树

②最小生成树及其应用

  • 应用举例

③构造最小生成树

MST性质

Minimum Spanning Tree

算法一:Prim(普里姆)算法
算法二:Kruskal(克鲁斯卡尔)算法

最小生成树可能不唯一

两种算法比较

2.最短路径

典型应用

问题求解

第一类:两点间的最短路径

第二类:某源点到其他各地的最短路径

两类问题的求解算法

单源最短路径-Dijkstra(迪杰斯特拉)算法

  • 具体步骤

所有顶点间的最短路径-Floyd(弗洛伊德)算法

Dijkstra算法时间复杂度O(n²),执行n次相当于O(n³)

Floyd算法时间复杂度O(n³)

  • 算法思想

  • 算法步骤

3.拓扑排序

针对有向无环图

有向无环图及其应用

AOV网可解决拓扑排序问题

AOE网可解决关键路径问题

拓扑排序案例

AOV网的特点

拓扑排序定义

拓扑排序方法

重要应用

4.关键路径

引例

根据已知AOE网求解关键路径

  • 4个描述量

  • 如何找关键活动?

  • 如何求某一个顶点的最早发生时间和最晚发生时间

  • 求关键路径步骤

  • 总结

以上是关于图 - 图的存储结构 - 邻接表表示法(一)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—图邻接表存储基本运算算法图的遍历

图的存储代码实现

图的存储结构之邻接表(详解)

数据结构与算法学习笔记 图

数据结构与算法学习笔记 图

王道数据结构6(图)