1. 引言

图是一种非常灵活且用途广泛的数据结构。它可以用于表示社交网络中的人际关系、地图中的道路连接等多种场景。在实际应用中,图的结构和性质决定了其适用性。

我们可以通过邻接矩阵或边列表等方式构建图结构,同时图的特性也多种多样,比如边的权重(Weighted)、图的稠密度(Dense / Sparse)等。此外,根据节点之间的连接方式,图还可以被进一步细分为不同的序列类型,如路径(Path)、回路(Circuit)、环路(Cycle)等。

本文将从基础图概念讲起,逐步深入探讨这些常见的图序列类型,帮助你系统地理解它们之间的区别与联系。


2. 图的基本概念

图由节点(Vertex)和边(Edge)构成。节点是图的基本组成单位,代表某种对象;边则表示两个节点之间的关系。

通常我们用 G = (V, E) 表示一个图,其中:

  • V = {v₁, v₂, ..., vₙ} 表示节点集合
  • E = {e₁, e₂, ..., eₙ} 表示边集合

图中可以没有边,但至少要有一个节点。没有节点的图称为空图(Null Graph),没有边但有节点的图称为平凡图(Trivial Graph)

如下图所示,是一个典型的简单图结构:

SimpleGraph


3. 路径(Path)

路径是一系列不重复节点通过图中存在的边连接而成的序列。

在无向图中,路径的首尾节点度数为 1,中间节点度数为 2。在有向图中,这种路径被称为有向路径(Dipath),要求所有边方向一致。

例如:

Path

通过分析路径,我们可以得出以下结论:

  • 若任意两节点之间存在无向路径(忽略方向),则该有向图是弱连通
  • 若每条路径都有对应的反向路径,则该图是强连通
  • 若两个节点之间存在一条或多条路径,则它们之间的距离定义为最短路径的长度(若无路径则为无穷大)

4. 回路(Circuit)

回路是一条起点和终点相同的节点序列,且不重复边,但允许重复节点。

常见回路类型包括:

  • 欧拉回路(Eulerian Circuit):经过图中每条边一次且仅一次的闭合路径
  • 哈密尔顿回路(Hamiltonian Circuit):经过图中每个节点一次且仅一次的闭合路径

例如:

Circuit

注意:

  • 第一张图是哈密尔顿回路图,但不是欧拉回路图
  • 第二张图是欧拉回路图,但不是哈密尔顿回路图

5. 环路(Cycle)

环路是一组相邻且互不重复的节点构成的序列,首尾节点相同

也就是说,环路是一种特殊的回路,它不允许重复节点(首尾节点除外)。

结论:

  • 每个环路都是回路,但不是每个回路都是环路
  • 每个哈密尔顿回路也一定是环路

根据是否包含环路,图可分为:

  • 有环图(Cyclic Graph)
  • 无环图(Acyclic Graph)

特别地,无环的连通图称为树(Tree)

如下图所示:

Cycle

小贴士:在并发系统中,使用-等待图(Wait-for Graph)中出现环路意味着死锁(Deadlock)发生。


6. 其他序列:游走(Walk)与迹(Trail)

除了前面提到的路径、回路、环路外,图中还存在两种更基础的序列:

6.1 游走(Walk)

游走是最一般的序列类型,允许节点和边重复

分为:

  • 开游走(Open Walk):起点和终点不同
  • 闭游走(Closed Walk):起点和终点相同

6.2 迹(Trail)

迹是一种不重复边的开游走,但允许重复节点。

例如:

WalkTrail


7. 总结对比表

类型 是否允许重复节点 是否允许重复边 是否闭合
游走(Walk) ✅(开/闭)
迹(Trail) ❌(开)
路径(Path) ❌(开)
回路(Circuit) ✅(闭)
环路(Cycle) ❌(首尾相同) ✅(闭)

⚠️ 注意:闭合序列不允许重复节点,唯一例外是首尾节点必须相同


8. 结论

通过本文的系统梳理,我们了解了图中常见的几种节点序列类型及其区别。这些概念在图论中非常重要,尤其是在以下场景中:

  • 检测使用-等待图中的死锁(通过检测环路)
  • 寻找最短路径或最优路径(如旅行商问题 Traveling Salesman Problem)
  • 判断图的连通性

掌握这些基本概念,有助于你在实际开发中更好地设计图结构、优化算法逻辑,避免踩坑。


原始标题:Graph Theory: Path vs. Cycle vs. Circuit