目录
一、图结构
图结构指的是如下图所示的由节点和边组成的数据。

二、深度优先遍历
2.1 图的遍历
图的遍历任务指的是从图中某个节点开始,遍历得到图中所有节点的过程。
2.2 深度优先遍历过程
假设我们从1号节点开始进行深度优先遍历。遍历的步骤如下:首先,我们选择1号顶点作为起始点。从1号顶点开始,我们尝试沿着边访问尚未到达过的顶点。我们发现2号顶点是未到达过的,所以我们移动到2号顶点。现在,以2号顶点为起点,我们继续尝试访问其他未到达过的顶点。这样,我们又到达了4号顶点。接着,以4号顶点为起点,我们尝试访问其他未到达过的顶点。然而,此时我们无法再通过4号顶点的边访问其他未到达过的顶点,所以我们需要回到2号顶点。回到2号顶点后,我们发现沿着2号顶点的边也无法再访问其他未到达过的顶点。因此,我们需要继续回到1号顶点。现在,我们继续检查1号顶点的边,看看是否还有其他未到达过的顶点。这时我们到达了3号顶点,然后以3号顶点为起点继续访问其他未到达过的顶点,最后到达了5号顶点。此时,所有顶点都已经被访问过,遍历结束。遍历的顺序如下图所示:

2.3 深度优先遍历核心思想
深度优先遍历的核心思想在于:首先选择一个未被访问过的顶点作为起始点,然后沿着当前顶点的边前进到未被访问过的顶点。当当前顶点没有未访问过的邻居顶点时,则回溯到上一个顶点,继续试探访问其他顶点,直到所有的顶点都被访问过为止。显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条分支进行同样的遍历,直到所有的顶点都被访问过为止。
2.4 深度优先遍历实现
如何将这一过程用代码实现呢?在讨论代码实现之前,我们需要先解决如何存储一个图的问题。最常用的方法是使用一个二维数组 e e e 来表示,具体如下所示:

上图中的二维数组中,第 i i i行第 j j j列表示从顶点 i i i到顶点 j j j是否存在一条边。其中, 1 1 1表示存在边, ∞ ∞ ∞表示不存在边。我们将自己到自己的路径(即 i i i等于 j j j)设为 0 0 0。这种图的存储方式被称为邻接矩阵存储法。
注意观察的同学会发现,这个二维数组沿主对角线对称。这是因为上述图是无向图。无向图指的是图的边没有方向性,例如边1-5表示,1号顶点可以到达5号顶点,同时5号顶点也可以到达1号顶点。
接下来,我们将解决如何使用深度优先搜索来实现图的遍历。
// C 代码
#include <stdio.h>
int book[101], sum, n, e[101][101];
void dfs(int cur) // cur 是当前所在的顶点编号
{
int i;
printf("%d ", cur);
sum++; // 每访问一个顶点,sum就加1
if (sum == n)
return; // 所有的顶点都已经访问过则直接退出
for (i = 1; i <= n; i++) // 从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点cur有边相连
{
// 判断当前顶点cur到顶点i是否有边,并判断顶点i是否已访问过
if (e[cur][i] == 1 && book[i] == 0)
{
book[i] = 1; // 标记顶点i已经访问过
dfs(i); // 从顶点i再出发继续遍历
}
}
return;
}
int main()

本文详细介绍了图的两种基本遍历方法——深度优先遍历和广度优先遍历,包括遍历过程、核心思想以及C和Python代码实现。通过邻接矩阵展示了如何在无向图中存储和操作边,为理解这两种算法提供了实例。
最低0.47元/天 解锁文章
3476

被折叠的 条评论
为什么被折叠?



