目录

CSP-JS初赛知识点精讲-图论

CSP-J/S初赛知识点精讲-图论

(1) 无向图: 每条边都是无方向的;

https://i-blog.csdnimg.cn/direct/983aa8eca12d4861b29c3ea643b5c40a.png

(2) 有向图: 每条边都是有方向的;

https://i-blog.csdnimg.cn/direct/65b903da8a394a23b92a5cc4858b817d.png

(3) 完全图: 任意两个顶点上都存在一个边;

https://i-blog.csdnimg.cn/direct/a47926dd94124e3d9e2d92fba9a2e3c6.png

(4) 子图: 从图中取出的部分集合;

https://i-blog.csdnimg.cn/direct/316d97ae62f74b868526ad9453a508e7.png

练习

https://i-blog.csdnimg.cn/direct/0a338c5c4f604d4499335368ec30172f.png

(5) 带权图:边上带权的图;(权:具有某种含义的数值,如表示两点之间的距离)

https://i-blog.csdnimg.cn/direct/2f4cc9211a0a42e9a93ce2974faefde2.png

(6) 连通图:无向图中任意两个点都存在路径可达;

https://i-blog.csdnimg.cn/direct/7614f5fd2c9a4625b7d946022ca49718.png

(7) 强连通图:有向图中,若任意两个顶点都存在路径可达;

https://i-blog.csdnimg.cn/direct/e3e9eeb06a3f4e9cba5d30b457f4c627.png

(8) 顶点的度:与顶点有关的边的数目;

有向图有分为出度和入度;

顶点 V 的出度=以 V 为起点有向边数;

顶点 V 的入度=以 V 为终点有向边数;

顶点 V 的度=V 的出度+V 的入度;

图的度=图中所有顶点度的和;

问题:一个图的顶点数为 n,边数为 e,则该图的度 = 2*e 。

(9) 路径与回路

路径:顶点 A 到顶点 B 的经过的所有的边;

简单路径:在一条路径中,除起点和终点外,若其余顶点各不相同;

回路:起点和终点相同的路径;

简单回路:由简单路径组成的回路称为简单回路;

https://i-blog.csdnimg.cn/direct/12ed31c306d04b5f9c6be7ca3caff897.png

图的存储

1. 邻接矩阵(数组)表示法

邻接数组表示法是以一个n*n的数组来表示一个具有n个顶点的图形。我们以数组的索引(下标)值来表示顶点,以数组的内容之来表示顶点间边是否存在(1表示存在,0表示不存在)。

例1:无向图的邻接矩阵

https://i-blog.csdnimg.cn/direct/1674478218284dafa71aef0cf3867276.png根据上述无向图得到邻接矩阵,可以得出如下结论:

  • 结论 1: 无向图的邻接矩阵是对称的;
  • 结论 2: 顶点 i 的度=第 i 行(列)中 1 的个数;

注意:完全图的邻接矩阵中,对角元素为 0,其余全 1。

例2:有向图的邻接矩阵

https://i-blog.csdnimg.cn/direct/50ec03ae21de4ad19132a984dec56b38.png

根据上述有向图得到邻接矩阵,可以得出如下结论:

  • 结论 1: 有向图的邻接矩阵可能是不对称的;
  • 结论 2: 顶点的出度 = 第 i 行元素之和;
    顶点的入度 = 第 i 列元素之和;
    图的度 = 矩阵中 1 的个数 * 2;
  • 结论 3: 图的存储空间占用量只与它的顶点数有关,与边数无关;适用于边稠密的图;图的存储

例3:带权图的邻接矩阵

https://i-blog.csdnimg.cn/direct/e3e8e4df31e44db288b9e221798a9e40.png

  • 邻接矩阵法优点:容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。
  • 邻接矩阵法缺点:n 个顶点需要 n*n 个单元存储边(弧)。对稀疏图而言尤其浪费空间。

2、邻接(链式)表表示法

邻接链表法:以链表来记录个顶点的邻接顶点。

例 1:无向图的邻接表

https://i-blog.csdnimg.cn/direct/ab82358fd009416bbe0aab42ef147659.png

例 2:有向图的邻接表

https://i-blog.csdnimg.cn/direct/bb3001a5c14b4c4b9f8802935b16e920.png

例 3:网(带权图)的邻接链表表示

https://i-blog.csdnimg.cn/direct/1a808834793d471ba4f0ffccbaa27c90.png

深度优先遍历与广度优先遍历

深度优先遍历与深搜 dfs 相似,从一个点 A 出发,将这个点标为已访问 visited[i]=true,然后再访问所有与之相连,且未被访问过的点。当 A 的所有邻接点都被访问过后,再退回到 A 的上一个点(假设是 B),再从 B 的另一个未被访问的邻接点出发,继续遍历。

例如对下边的这个无向图深度优先遍历,假定先从 1 出发。程序以如下顺序遍历:

https://i-blog.csdnimg.cn/direct/f3add1a12d004d47b8be4fda48f3f49d.png

a. 1→2→5,然后退回到 2,退回到 1。

b. 从 1 开始再访问未被访问过的点 3,3 没有未访问的邻接点,退回

c. 再从 1 开始访问未被访问过的点 4,再退回 1。

d. 起点 1 的所有邻接点都已访问,遍历结束。

广度优先遍历并不常用,从编程复杂度的角度考虑,通常采用的是深度优先遍历。

广度优先遍历和广搜 bfs 相似,因此使用广度优先遍历一张图并不需要掌握什么新的知识,在原有的广度优先搜索的基础上,做一点小小的修改,就成了广度优先遍历算法。

一笔画问题

如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。

定义奇点是指跟这个点相连的边数目有奇数个的点。对于能够一笔画的图,于是有以下两个定理。

  • 定理 1:存在欧拉路的条件:图是连通的,有且只有 2 个奇点。
  • 定理 2:存在欧拉回路的条件:图是连通的,有 0 个奇点。

两个定理的正确性是显而易见的,既然每条边都要经过一次,那么对于欧拉路,除了起点和终点外,每个点如果进入了一次,显然一定要出去一次,显然是偶点。对于欧拉回路,每个点进入和出去次数一定都是相等的,显然没有奇点。

求欧拉路的算法很简单,使用深度优先遍历即可。

根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行 dfs,时间复杂度为 O(m+n),m 为边数,n 是点数。