数据结构与算法(C++)– 图(Graph)

版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/82457780

数据结构与算法(C++)– 图(Graph)


1、图的基础概念

定义:一个图G=(V, E)由顶点(vertex)的集V和边(edge)的集E组成。

  • 边(edge):一对点即为一条边(v, w),其中v, w ∈ V
  • 有向图(directed):点对是有序的
  • 无向图(undirected):点对是无序的
  • 邻接(adjacent):w 邻接到 v,当且仅当(v, w )∈ E
  • 权(weight)/值(cost):边上的值
  • 路径(path):连通两点间的边
  • 长(lengh):路径上的边数
  • 简单路径(simple path):路径上的顶点都是互异的
  • 环(cycle):有向图中,首尾相连长度至少为1的简单路径。
  • 无环(acyclic):有向图中中没有环
  • 连通的(connected):无向图中每一个顶点到其它顶点都存在一条路径
  • 强连通的(strongly connected):有向图具有连通的性质
  • 基础图(underlying graph):无向图去掉边的方向
  • 弱连通的(connected):有向图的基础图是连通的
  • 完全图(complete graph):每一对顶点都存在一条边

几个关系:

  • n 个顶点的无向连通图,至少有 n-1 条边
  • n 个顶点的有向强连通图,至少有 n 条边
  • n 个顶点的无向完全图,有 n(n-1)/2 条边
  • n 个顶点的有向完全图,有 n(n-1) 条边

2、图的表示

图有两种表示方法:邻接矩阵,邻接表
这里写图片描述
邻接矩阵: 稠密(dense),复杂度为O(|V|^2)
这里写图片描述
邻接表: 稀疏(sparse),复杂度为O(|E| + |V|)
这里写图片描述


3、广度优先搜索(Breadth-first search,BFS)

定义: 按照由近到远的层进行搜索

实现: 使用队列(queue)结构实现。首先起点入队,队列出队一个元素,把邻接于该元素的所有顶点入队,循环直到队列为空即所有顶点都被访问过。
这里写图片描述
这里写图片描述


4、深度优先搜索(Depth-first search,DFS)

定义: 按照由深到浅的递归进行搜索

实现: 使用栈(stack)结构实现。首先起点入栈,出栈一个元素,把邻接于该元素的所有顶点入栈,循环直到栈为空即所有顶点都被访问过。

这里写图片描述

5、有向无权图的最短路径

实现: 使用广度优先搜索,复杂度为O(|E| + |V|)。

  1. 首先把起点的长(dv)设为0其它点的长设为∞
  2. 使用广度优先搜索算法更新点的dv值(邻接点+1),并记录更新点的父点(pv)
  3. 直到所有的点都被更新过,停止搜索
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/Wang_Jiankun/article/details/82457780