跳转至

图的应用极为广泛,已渗入到诸如物理、化学、电信工程、计算机科学,以及数学等其他分支中。在离散数学中,图论是专门研究图的性质的数学分支,而在数据结构中,则应用图论的知识讨论如何在计算机上实现图的操作,因此主要学习图的存储结构,以及若干图的操作的实现。

图的定义和基本术语

图的定义

(Graph)\(G\)由两个集合\(V\)(Vertex)和\(E\)(Edge)组成,记为\(G = (V,E)\),其中\(V\)是顶点的有穷非空集合,\(E\)\(V\)中顶点偶对的有穷集合,这些顶点偶对称为边。\(V(G)\)\(E(G)\)通常分别表示图\(G\)的顶点集合和边集合,\(E(G)\)可以表示为空集。若\(E(G)\)为空,则图\(G\)只有顶点而没有边。

对于图\(G\),若边集\(E(G)\)为有向边的集合,则称该图为有向图;若边集\(E(G)\)为无向边的集合,则称该图为无向图。

  • \(<x, y>\)是有序的,有向图。\(<x, y>\)也称作一条弧,则\(x\)为弧尾,\(y\)为弧头。
  • \((x, y)\)是无序的,偶对,无向图。无向图中称为边。

图

图的基本术语

  1. 子图:假设有两个图 \(G = (v, E)\)\(G^{'}=(V^{'}, E^{'})\) ,如果 \(V^{'} \subseteq V 且 E^{'} \subseteq E\),则称 \(G^{'}\)\(G\)子图

    子图

  2. 无向完全图和有向完全图:对于无向图,若具有 \(n(n - 1)/2\) 条边,则称为无向完全图 (任意两个顶点之间一条边)。对于有向图,若具有 \(n(n - 1)\) 条弧,则称为有向完全图(任意两个顶点之间都有两条边)。

    完全图

  3. 稀疏图和稠密图:有很少条边或弧(如 \(e < nlog_{2}n\) )的图称为稀疏图,反之称为稠密图

  4. 权和网:在实际应用中,每条边可以标上具有某种含义的数值,该数值称为该边上的。这些权可以表示从一个顶点到另一个顶点的距离或耗费。这种带权的图通常称为

  5. 邻接点:对于无向图 \(G\) ,如果图的边 \((v, v^{'}) \subseteq E\) ,则称顶点 \(v\)\(v^{'}\) 互为邻接点,即 \(v\)\(v^{'}\) 相邻接。边 \((v, v^{'})\) 依附于顶点 \(v\)\(v^{'}\) ,或者说边 \((v, v^{'})\) 与顶点 \(v\)\(v^{'}\) 相关联

  6. 度、入度和出度:顶点 \(v\)是指和 \(v\) 相关联的边的数目,记为 \(TD(v)\) 。对于有向图,顶点 \(v\) 的度分为入度和出度。入度是以顶点 \(v\) 为头的弧的数目,记为 \(ID(v)\)出度是以顶点 \(v\) 为尾的弧的数目,记为 \(OD(v)\) 。顶点 \(v\) 的度为 \(TD(v) = ID(v) + OD(v)\) 。一般地,如果顶点 \(v_{i}\) 的度记为 \(TD(v_{i})\) ,那么一个有 \(n\) 个顶点 \(e\) 条边的图,满足如下关系 $$ e = \frac{1}{2} \sum_{i = 1}^{n}TD(v_{i}) $$

    图的度

  7. 路径和路径长度:在无向图 \(G\) 中,从顶点 \(v\) 到顶点 \(v^{'}\)路径是一个顶点序列\((v = v_{i, 0}, v_{i, 1}, ... v_{i, m} = v^{'})\) ,其中 \((v_{i, j - 1}, v_{i, j}) \subseteq E, 1 \le j \le m\) 。如果 \(G\) 是有向图,则路径也是有向的,顶点序列应满足 \(<v_{i, j-1}, v_{i, j}> \subseteq E, 1 \le j \le m\)路径长度是一条路径上经过的边或弧的数目。

  8. 回路或环:第一个顶点和最后一个顶点相同的路径称为回路或环

  9. 简单路径、简单回路或简单环:序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路,称为简单回路简单环

    简单路径和回路

  10. 连通、连通图和连通量:在无向图 \(G\) 中,如果从顶点 \(v\) 到顶点 \(v_{'}\) 有路径,则称 \(v\)\(v_{'}\)连通的。如果对于图中任意两个顶点 \(v_{i}、v_{j} \subseteq V\)\(v_{i}\)\(v_{j}\) 都是连通的,则称 \(G\)连通图。 所谓连通分量 ,指的是无向图中的极大连通子图。

    • 极大连通子图:存在无向图\(G\)\(G^{'}\)\(G\)的连通子图。如果将\(G\)中任意不在\(G^{'}\)中的顶点加入\(G^{'}\)\(G^{'}\)不再连通,则称\(G^{'}\)极大连通子图

    连通图和强连通图

  11. 强连通图和强连通分量:在有向图 \(G\) 中,如果对于每一对 \(v_{i},v_{j} \subseteq V\)\(v_{i} \ne v_{j}\) ,从 \(v_{i}\)\(v_{j}\) 和从 \(v_{j}\)\(v_{i}\) 都存在路径,则称 \(G\) 是强连通图。有向图中的极大强连通子图称作有向图的强连通分量。

    连通分量 强连通分量

  12. 连通图的生成树:一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的 \(n - 1\) 条边,这样的连通子图称为连通图的生成树(简单说就是包含无向图\(G\)所有顶点的极小连通子图)。

    • 极小连通子图:存在无向图\(G\)\(G^{'}\)\(G\)的连通子图。如删除\(G^{'}\)中任意一条边,\(G^{'}\)不再连通,则称\(G^{'}\)极小连通子图

    生成树

  13. 有向树和生成森林:有一个顶点的入度为0,其余顶点的入度均为1的有向图称为有向树。一个有向图的生成森林是由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。

案例引入

  • "六度空间"理论。

图的类型定义

  • 图的抽象数据类型定义

图的存储结构

  • 借助二维数组表示。数组表示法(邻接矩阵)
  • 链式存储结构。邻接表、邻接多重表、十字链表。

邻接矩阵

  • 无向图的邻接矩阵:行号vi表示从vi出发,行中某列j标记为1时,表示vi到vj存在边。
  • 有向图和网(即有权图)的邻接矩阵:行号vi表示从vi出发,行中某列j标记为1时,表示vi到vj存在弧。vi是弧尾,vj是弧头。
  • 采用邻接矩阵表示法创建无向网
  • 邻接矩阵表示法的优缺点

    无向图的邻接矩阵 有向图邻接矩阵

  • 无向图的邻接表

  • 有向图的邻接表(邻接表和逆邻接表)
  • 建立邻接表算法
  • 邻接表表示法优缺点及与邻接矩阵的关系
  • 十字链表
  • 邻接多重表

邻接表

十字链表

邻接多重表

图的遍历

深度优先搜索

  • 深度优先搜索遍历思想
  • 邻接矩阵上的遍历算法
  • 邻接表上的遍历算法及算法分析
  • 广度优先搜索遍历及其实现

广度优先搜索

图的应用

最小生成树

  • Prim算法(用于稠密图较好)
  • Kruskal算法(并查集,用于稀疏图较好)

最短路径

拓扑排序

关键路径

案例分析与实现