Pwner's Blog

能全力以赴不尽力而为

0%

数据结构之图

图的基本概念

  1. 有向图
  2. 无向图
  3. 简单图
  4. 多重图
  5. 完全图(亦称 简单完全图)
  6. 子图
  7. 连通图,连通分量
  8. 强连通图,强连通分量
  9. 生成树,生成森林
  10. 顶点的度(入度,出度)
  11. 边的权和网
  12. 稠密图,稀疏图
  13. 路径,路径长度,回路
  14. 简单路径,简单回路
  15. 距离
  16. 有向树

图的存储

👉🏻邻接矩阵法

一维数组存储顶点信息(将顶点编号),二维数组存储顶点间关系(二维数组存储边的信息)

邻接矩阵

网(带权图)的邻接矩阵

存储结构定义:

1
2
3
4
5
6
7
8
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct{
VertexType Vex[MaxVertexNum];///顶点表(一维表)
EdgeType Edge[MaxVertexNum][MaxVertexNum];///顶点关系表(二维表)
int vexnum,arcnum;
}MGraph;

👉🏻邻接表法

邻接表是在稀疏图的情况下对邻接矩阵的一种改进,是实际中广泛采用的一种存储结构

结点结构

有向图和无向图的邻接表

有向图 无向图

存储结构定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define  MAX_VERTEX_NUM 20//最大顶点个数
#define VertexType int//顶点数据的类型
#define InfoType int//图中弧或者边包含的信息的类型
typedef struct ArcNode{
int adjvex;//邻接点在数组中的位置下标
struct ArcNode * nextarc;//指向下一个邻接点的指针
InfoType * info;//信息域
}ArcNode;
typedef struct VNode{
VertexType data;//顶点的数据域
ArcNode * firstarc;//指向邻接点的指针
}VNode,AdjList[MAX_VERTEX_NUM];//存储各链表头结点的数组
typedef struct {
AdjList vertices;//图中顶点的数组
int vexnum,arcnum;//记录图中顶点数和边或弧数
int kind;//记录图的种类
}ALGraph

👉🏻十字链表

有向图的另一种链式存储结构。可看是将有向图邻接表逆邻接表结合得到的一种存储方法。对应于有向图中的每一条弧有一个结点,对应于每个顶点也有一个结点。图的十字链表不唯一,但是一个十字链表确定一个图。

好处:既容易找以 Vi 为尾的弧,又容易找到以 Vi 为头的弧 ==> 容易求得顶点的入度出度

结点结构

弧结点 顶点结点

存储结构定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct ArcNode
{
int tailvex, headvex; //弧尾、弧头在表头数组中位置
struct ArcNode *hlink; //指向弧头相同的下一条弧
struct ArcNode *tlink; //指向弧尾相同的下一条弧
InfoType *info; //弧相关信息指针
}ArcNode;

typedef struct VexNode
{
VertexType data; //存与顶点有关信息
struct arcnode *firstin; //指向以该顶点为弧头的第一个弧结点
struct arcnode *firstout; //指向以该顶点为弧尾的第一个弧结点
}VexNode;

typedef struct
{ VerNode xlist[MAX_VERTEX_NUM ] ; //表头向量
int vexnum, arcnum;
}OLGraph;

图示

十字链表

👉🏻邻接多重表

无向图的另一种链式存储结构。 是为了解决在邻接表中对同一条边存储两个结点而引入的一种结构。

结点结构

边结点

其中:

mark 为标志域,可用于标记该边是否被搜索过。

ivexjvex 记录依附于该边的两个顶点;

ilink 指示依附于 ivex 的下一条边。

jlin 指示依附于 jvex 的下一条边。

info 与边相关的信息。

顶点结点

其中:

data 存储顶点的相关信息;

firstedge 指示第一条依附于该顶点的边

邻接多重表

图的遍历

👉🏻深度优先遍历 (DFS)

算法思路

性能分析

深度优先生成树

👉🏻广度优先遍历 (BFS)

算法思路

性能分析

广度优先生成树

👉🏻应用

图的遍历可以用来判断图的连通性。

图的应用

  1. 图的遍历 —— 连通性判断
  2. 有向无环图 —— 拓扑排序
  3. 带权有向图 —— 最短路径,Dijkstra 算法
如果文章对你有用,可以请我喝杯咖啡~
  • 本文作者: Pwner
  • 本文链接: https://pwner.cn/posts/f932ba85.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!