📜  使用邻接矩阵实现DFS(1)

📅  最后修改于: 2023-12-03 15:36:42.190000             🧑  作者: Mango

使用邻接矩阵实现DFS

深度优先搜索(DFS)是一种常见的搜索算法,通常用于解决迷宫问题、图遍历等问题。邻接矩阵是一种表示图结构的数据结构,它是一个二维数组,其中元素matrix[i][j]表示顶点i和顶点j是否有边相连。本文将介绍如何使用邻接矩阵实现DFS。

DFS(深度优先搜索)

DFS是一种沿着某个路径尽可能远地搜索图的算法。DFS可以用递归和非递归两种方式实现。使用递归实现DFS时,我们从起始节点开始,访问它的一个未被访问的邻居节点,并将其标记为已访问;然后,递归访问该邻居节点的未访问邻居节点,直到遇到没有未访问邻居节点的节点为止。

使用非递归实现DFS时,我们使用一个栈来保存尚未访问的节点。从起始节点开始,我们将其入栈,并标记为已访问;然后,我们重复以下步骤:从栈顶取出一个节点x,访问其一个未被访问的邻居节点y,并将y入栈,并标记为已访问;如果x没有未被访问的邻居节点,则弹出栈顶元素。

邻接矩阵

邻接矩阵是一种表示图结构的数据结构,它使用二维数组来表示图的所有边。假设图G有n个顶点,则邻接矩阵为n*n的矩阵,其中matrix[i][j]表示顶点i和顶点j是否有边相连。

邻接矩阵可以使用布尔值或整数来表示有向图或无向图。当使用布尔值时,matrix[i][j]的值为true表示顶点i和顶点j之间有一条边;当使用整数时,matrix[i][j]的值表示边的权重。

DFS实现

下面是使用邻接矩阵实现DFS的代码片段:

public class Graph {
    private int[][] matrix; // 邻接矩阵
    private boolean[] visited; // 标记节点是否已经访问

    public void dfs(int v) {
        visited[v] = true;
        System.out.print(v + " ");
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[v][i] != 0 && !visited[i]) {
                dfs(i);
            }
        }
    }
}

上述代码中,Graph类表示一个图结构,matrix是邻接矩阵,visited数组用于标记节点是否已经访问。

dfs方法是DFS的主要方法,参数v表示从哪个节点开始遍历。在dfs方法中,我们首先将v节点标记为已访问,然后输出v节点,接着遍历v的所有未访问邻居节点。如果邻居节点i未被访问且与v节点之间有边相连,则递归访问节点i。

总结

本文介绍了使用邻接矩阵实现DFS的方法。DFS是一种常见的搜索算法,可以用于解决迷宫问题、图遍历等问题。邻接矩阵是一种表示图结构的数据结构,使用它可以快速判断两个节点之间是否有边相连。