
第11周 【项目3 - 图遍历算法实现】
发布日期:2021-05-24 13:03:20
浏览次数:20
分类:精选文章
本文共 2187 字,大约阅读时间需要 7 分钟。
深度优先遍历(DFS)和广度优先遍历(BFS)是图遍历算法中的两种重要方法。这些算法在程序设计中常用于查找图中的路径、连通区域或识别图的各种属性。以下是关于这两种算法的详细说明。
深度优先遍历(DFS)
DFS是一种以栈数据结构为基础的遍历算法。与BFS(队列)不同,DFS会尽可能深入递归遍历每一个可达的节点。其核心思想是:进入节点后,尽可能深入访问该节点的子节点,而不是访问顺序上的下一个节点。
代码示例解析
void DFS(ALGraph *G, int v) { ArcNode *p; int w; visited[v] = 1; printf("%d ", v); p = G->adjlist[v].firstarc; while (p != NULL) { w = p->adjvex; if (visited[w] == 0) DFS(G, w); p = p->nextarc; }}
代码主要包含几个部分:
visited[v] = 1
:标记节点v
已访问。printf("%d ", v)
:输出当前访问的节点编号。p = G->adjlist[v].firstarc
:从当前节点v
获得其第一个邻接点p
。while (p != NULL)
:循环处理邻接点,如果p
为_NULL
则退出循环。w = p->adjvex
:获取邻接点p
的节点编号w
。if (visited[w] == 0)
:检查节点w
是否已访问。- 如果未访问,则调用
DFS(G, w)
继续深度遍历。
- 如果未访问,则调用
p = p->nextarc
:获取邻接点p
的下一个邻接点。
主函数main()
中:
- 初始化图
G
。 - 使用测试图从数组
A
构建图的邻接表。 - 调用
DFS(G, 0)
进行从节点0
开始的深度优先遍历。 - 快速查看完整代码点击查看。
测试图示
测试使用的图结构如下:
1 <-> 2 <-> 3| | |8 <-> 4 <-> 5| |6 <-> 7
优势:
- DFS能够在图中找到哈密尔顿路径或环。
- 适合处理树和� Trails结构。
- 适用于需要预先知道深度信息的场景。
广度优先遍历(BFS)
BFS是一种以队列数据结构为基础的遍历算法。其核心思想是:从起点出发,一层一层地访问邻接节点,确保每一层的节点都被访问过后才访问下一层。这与 DFS 的区别在于,BFS更注重访问节点的层数。
代码示例解析
void BFS(ALGraph *G, int v) { ArcNode *p; int w, i; etext int queue[MAXV], front = 0, rear = 0; int visited[MAXV]; for (i = 0; i < G->n; i++) { visited[i] = 0; } printf("%2d", v); visited[v] = 1; rear = (rear + 1) % MAXV; queue[rear] = v; while (front != rear) { front = (front + 1) % MAXV; w = queue[front]; p = G->adjlist[w].firstarc; while (p != NULL) { if (visited[p->adjvex] == 0) { printf("%2d", p->adjvex); visited[p->adjvex] = 1; rear = (rear + 1) % MAXV; queue[rear] = p->adjvex; } p = p->nextarc; } } printf("\n");}
代码主要包含几个部分:
visited[MAXV]
:存储节点访问标记。- 队列初始化:使用循环队列结构,避免越界错误。
front
和rear
:队列的前置和后置指针。- 从起点
v
开始,依次访问所有可达节点。
主函数main()
中:
- 构建图的邻接表。
- 调用
BFS(G, 2)
从节点2
开始广度遍历。 - 调用
BFS(G, 0)
从节点0
开始广度遍历。 - 快速查看完整代码点击查看。
测试图示
与DFS相同,测试图结构如下:
1 <-> 2 <-> 3| | |8 <-> 4 <-> 5| |6 <-> 7
优势:
- BFS能够找到图的最短路径。
- 适合处理网格或层级结构的图。
- 适用于需要访问顺序不影响结果的场景,比如任务调度。
总结
两种遍历算法各有优势:
- DFS:适合预先知道深度信息的场景,能够找到哈密尔顿路径。
- BFS:擅长找到最短路径,适合网格和层级结构。
通过合理选择算法,可以更好地解决实际问题。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月24日 04时08分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
wxWidgets源码分析(5) - 窗口管理
2019-03-06
wxWidgets源码分析(8) - MVC架构
2019-03-06
wxWidgets源码分析(9) - wxString
2019-03-06
[梁山好汉说IT] 梁山好汉和抢劫银行
2019-03-06
[源码解析] 消息队列 Kombu 之 基本架构
2019-03-06
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
wx.NET CLI wrapper for wxWidgets
2019-03-06
ASP.NET MVC Action Filters
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06
04_Mysql配置文件(重要参数)
2019-03-06
JavaSE总结
2019-03-06
Python IO编程
2019-03-06
CSS入门总结
2019-03-06
使用 TortoiseGit 时,报 Access denied 错误
2019-03-06
基于 HTML5 WebGL 的污水处理厂泵站自控系统
2019-03-06
c++之程序流程控制
2019-03-06