【朝夕的ACM笔记】目录与索引
图论的基础概念
一、什么是图
图作为一种数据结构,表现的是若干对象的集合,以及这些对象间关系的集合。
比如用图表现一个班级里各个同学的关系,则每个同学就是一个对象,所有的同学以及他们之间所有的关系的集合就是图。
图中的对象称为“结点”或“顶点”,一般用圆来表示,顶点间的关系称为“边”,用连线或箭头来表示。
图一般分为四种:
- 无向图:边没有方向,以连线表示。
示例:A和B是朋友,则B和A也是朋友。调转初始与末尾结点后,关系不变。
- 有向图:边有方向,以箭头表示。
示例:要先学习A知识后才能学B知识。调转初始与末尾结点后,关系不同。
- 加权无向图:边无方向,有权值。
A与B直线距离50公里,B与A直线距离也是50公里。
- 加权有向图:边有方向,有权值。
从A到B只能坐车,需要花费50分钟。从B到A只能步行,需要花费100分钟。
![9caebd93b611394dff53b771bcd217d7.png](https://i-blog.csdnimg.cn/blog_migrate/a9214f4eb6fa10cc9f504452ed55a190.png)
![be05fb47afd9dab8deeb54f8e94f9ad4.png](https://i-blog.csdnimg.cn/blog_migrate/655f681dafbe58598bbb64334c665f0c.png)
![3bfdc1e8c4337b977ac3edc335ea37d0.png](https://i-blog.csdnimg.cn/blog_migrate/6952d6d91e809584ae214c956a451994.png)
![be627f2aa981b0914006b2e50c36521b.png](https://i-blog.csdnimg.cn/blog_migrate/27aa71e02d32f72bddd1f84a626e5fee.png)
二、图的基本术语
顶点集合为
连接顶点
边的权值记为
无向图中若两顶点有边,则称两顶点相邻,相邻顶点构成的顶点序列称路径。起点若与终点相同,则称为环。
无环有向图的简称为“DAG”。
与顶点相连的边数称为度(Degree)。有向图的度又分为入度(以该顶点为终点)和出度(以该顶点为起点)。
连通图:任意两个顶点都是连通的,即都可从第一个顶点到第二个顶点,也可以从第二个顶点到第一个顶点。
完全图:任意两个顶点间都有一条边,无向完全图共有
稀疏图:边数远小于完全图的图。
稠密图:边数接近于完全图的图。
三、图的表示(储存)
常见的储存图的方法有两种,邻接矩阵和邻接表,其实还有一种算法竞赛中常用的链式前向星,但本篇暂不介绍。
3.1 邻接矩阵
若有
int
需要注意的是,邻接矩阵的空间复杂度为
3.2 邻接表
为了便利,我们邻接表使用C++标准库的vector容器来进行演示。
若有
若需要表示权值,可以使用结构体。
vector
邻接表相比邻接矩阵要常用得多,后面的说明也将以邻接表为例。
四、图的遍历
4.1 DFS和BFS的特点
图的遍历与搜索一样,分为DFS(深度优先搜索)和BFS(广度优先搜索)两种。
DFS的特点是,顺着当前的路径一直往后遍历,直到无点可访问时,再返回上一级节点。
![60b3a048d7f977241461ddaeea7b1de0.png](https://i-blog.csdnimg.cn/blog_migrate/028590b64128dc8cdaa90792f7c9e70c.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条边的无向图。你可以对一个点进行一次操作,操作后,与这个点相连的边将都被封锁。不可对原图中两个相邻的点都进行操作。问,最少需要多少次操作,可以将所有的边都封锁?
本质上就是一条边的两个点里,一个操作一个不操作。具体写法请自行思考。