数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历_【朝夕的ACM笔记】图论-图论基础概念...

【朝夕的ACM笔记】目录与索引

图论的基础概念

一、什么是图

图作为一种数据结构,表现的是若干对象的集合,以及这些对象间关系的集合。

比如用图表现一个班级里各个同学的关系,则每个同学就是一个对象,所有的同学以及他们之间所有的关系的集合就是图。

图中的对象称为“结点”或“顶点”,一般用圆来表示,顶点间的关系称为“边”,用连线或箭头来表示。

图一般分为四种:

  • 无向图:边没有方向,以连线表示。
示例:A和B是朋友,则B和A也是朋友。调转初始与末尾结点后,关系不变。
  • 有向图:边有方向,以箭头表示。
示例:要先学习A知识后才能学B知识。调转初始与末尾结点后,关系不同。
  • 加权无向图:边无方向,有权值。
A与B直线距离50公里,B与A直线距离也是50公里。
  • 加权有向图:边有方向,有权值。
从A到B只能坐车,需要花费50分钟。从B到A只能步行,需要花费100分钟。

9caebd93b611394dff53b771bcd217d7.png
无向图

be05fb47afd9dab8deeb54f8e94f9ad4.png
有向图

3bfdc1e8c4337b977ac3edc335ea37d0.png
加权无向图

be627f2aa981b0914006b2e50c36521b.png
加权有向图

二、图的基本术语

顶点集合为

,边集合为
的图记为
,其顶点数为
,边数为

连接顶点

的边记为
。在有向图中
是不同的边。

边的权值记为

无向图中若两顶点有边,则称两顶点相邻,相邻顶点构成的顶点序列称路径。起点若与终点相同,则称为

无环有向图的简称为“DAG”。

与顶点相连的边数称为度(Degree)。有向图的度又分为入度(以该顶点为终点)和出度(以该顶点为起点)。

连通图:任意两个顶点都是连通的,即都可从第一个顶点到第二个顶点,也可以从第二个顶点到第一个顶点。

完全图:任意两个顶点间都有一条边,无向完全图共有

条边,有向完全图共有
条边。

稀疏图:边数远小于完全图的图。

稠密图:边数接近于完全图的图。

三、图的表示(储存)

常见的储存图的方法有两种,邻接矩阵和邻接表,其实还有一种算法竞赛中常用的链式前向星,但本篇暂不介绍。

3.1 邻接矩阵

若有

个点,则开一个
的二维数组,其中一维表示起点,另一维则表示终点,其储存的值则可用于表示边的存在与否或者边的权值大小。
int 

需要注意的是,邻接矩阵的空间复杂度为

,对于点较多的图论题,大概率会超出内存的限制。

3.2 邻接表

为了便利,我们邻接表使用C++标准库的vector容器来进行演示。

若有

个点,则开一个大小为
的vector数组,其中数组下标表示起点,vector中储存的为终点。

若需要表示权值,可以使用结构体。

vector

邻接表相比邻接矩阵要常用得多,后面的说明也将以邻接表为例。

四、图的遍历

4.1 DFS和BFS的特点

图的遍历与搜索一样,分为DFS(深度优先搜索)和BFS(广度优先搜索)两种。

DFS的特点是,顺着当前的路径一直往后遍历,直到无点可访问时,再返回上一级节点。

60b3a048d7f977241461ddaeea7b1de0.png

以上图为例——假设对所有可访问的节点,将优先访问编号小的节点。

则我们从0号节点出发,前往当前可访问的最小编号节点2。

过程为0-2-3。此时到3已无可访问节点,于是放回上一级。

总过程为0-2-3-4-1-5。

BFS的特点是,将当前所在节点可访问的所有节点都加入队列,等全都访问过后再前往下一层。

还是以上图为例,BFS的过程将是0-2-4-5-3-1。

4.2 参考代码

vector

4.3 图的遍历相关例题

4.3.1 查找文献 洛谷 P5318

完全的裸题,用于考察分别使用DFS和BFS来遍历图。

4.3.2 图的遍历 洛谷 P3916

给你一个N个点,M条边的有向图,问对于图中的每一个点,从其出发能到达的点的最大编号为多少。
输出N个点的答案。

同样是一道遍历图的裸题。可以反向建边,从最大编号开始DFS(或BFS都可),将其能到达的所有点的答案都设置为它的编号。

4.3.3 封锁阳光大学 洛谷 P1330

给你一个N个点,M条边的无向图。你可以对一个点进行一次操作,操作后,与这个点相连的边将都被封锁。不可对原图中两个相邻的点都进行操作。问,最少需要多少次操作,可以将所有的边都封锁?

本质上就是一条边的两个点里,一个操作一个不操作。具体写法请自行思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值