c语言dfs非递归算法,图的BFS以及DFS递归非递归实现

本文详细介绍了如何使用C语言实现图的深度优先遍历DFS,包括递归和非递归两种邻接表和邻接矩阵的方法。通过示例代码展示了DFS的正确实现,避免了常见的错误陷阱,最后提供了测试代码以验证算法的正确性。
摘要由CSDN通过智能技术生成

f8d98450b57f?utm_campaign=maleskine

image.png

本文所使用的所有邻接表以及邻接矩阵定义均在之前博客,这里不再赘述

一、深度优先遍历DFS(Depth-first search)

1.1.1 DFS递归邻接表实现原理

图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历。它的基本思想是:首先访问出发点v,并将其标记为已访问过;然后选取与v邻接的未被访问的任意一个顶点w,并访问它:再选取与w邻接的未被访问的任一顶点并访问,以此重复进行。当一个顶点所有的邻接顶点都被访问过时,则依次退回到最近被访问过的顶点,若该顶点还有其他邻接顶点未被访问,则从这些未被访问的顶点中取一个并重复上述访问过程,直至图中所有顶点都被访问过为止。

/**

* @param graph 邻接表

* @param i 开始节点下标

*/

public static void dfsRecursion(AGraph graph, int i) {

ArcNode p;

visited[i] = 1;

dfsToString(graph, i);

p = graph.adjList[i].firstArc;

while (p != null) {

//如果没有访问过,则递归

if (visited[p.adjvex] == 0) {

dfsRecursion(graph, p.adjvex);

}

p = p.nextArc;

}

}

public static void dfsToString(AGraph graph, int i){

System.out.print(graph.adjList[i].name + " ");

}

1.1.2 DFS递归邻接矩阵实现原理

使用邻接矩阵实现DFS递归思路上和邻接表基本是一样的.不同的就是每次检索所有节点与当前节点是否有连接

/**

* @param graph

* @param i

*/

public static void dfsRecursionMatrix(MGraph graph, int i) {

visited[i] = 1;

System.out.print(graph.vex[i].no + " ");

for (int j = 0; j < graph.n; j++) {

//因为是无权无向图,所以权值默认为1

if(graph.edges[i][j] == 1 && visited[j] == 0){

dfsRecursionMatrix(graph,j);

}

}

}

1.2.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值