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

本文详细介绍了如何使用C语言实现图的深度优先遍历DFS,包括递归和非递归两种邻接表和邻接矩阵的方法。通过示例代码展示了DFS的正确实现,避免了常见的错误陷阱,最后提供了测试代码以验证算法的正确性。
最低0.47元/天 解锁文章
606

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



