java dfs 算法

下面是一个基于Java的DFS(深度优先搜索)算法示例,其中对于一个给定的图进行遍历,找到所有与给定起点相连的节点:

import java.util.*;

public class Graph {
    private int V; // 图中节点的数量
    private LinkedList<Integer>[] adj; // 邻接表

    // 构造函数
    Graph(int v) {
        V = v;
        adj = new LinkedList[v];
        for (int i = 0; i < v; ++i)
            adj[i] = new LinkedList();
    }

    // 添加一条边到图中
    void addEdge(int v, int w) {
        adj[v].add(w);
    }

    // 使用 DFS 遍历图中所有节点
    void DFS(int v, boolean[] visited) {
        visited[v] = true;
        System.out.print(v + " ");

        Iterator<Integer> i = adj[v].listIterator();
        while (i.hasNext()) {
            int n = i.next();
            if (!visited[n])
                DFS(n, visited);
        }
    }

    // 对给定起点进行 DFS 遍历
    void DFS(int v) {
        boolean[] visited = new boolean[V];
        DFS(v, visited);
    }

    public static void main(String args[]) {
        Graph g = new Graph(4);

        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("从起点 2 开始遍历:");
        g.DFS(2);
    }
}

在上述代码中,首先定义了一个 Graph 类,包括节点数量(V)和邻接表(adj)。然后定义了一个构造函数和一个 addEdge() 方法,用于向图中添加边。

接下来是 DFS() 方法,该方法用于遍历图中的节点并打印它们。该方法有两个参数,第一个参数表示要访问的节点,第二个参数是一个布尔数组,用于跟踪哪些节点已经被访问过。

在 DFS() 方法中,首先将当前节点标记为已访问,并将其值打印出来。然后迭代访问当前节点的邻居,如果邻居节点还没有被访问过,则对该邻居节点递归调用 DFS() 方法进行访问。

最后是主函数,创建一个图并添加边,然后调用 DFS() 方法从节点 2 开始遍历图。

当运行该程序时,将打印出以下输出结果:

从起点 2 开始遍历:
2 0 1 3

关于dfs的应用

DFS(深度优先搜索)算法是一种常用的搜索算法,主要应用于图的遍历、路径搜索、连通性判断和状态空间搜索等问题。以下是 DFS 算法的几个典型应用:

  1. 图的遍历:DFS 可以用于图的遍历,通过深度优先的方式访问所有节点。DFS 算法可以用于解决许多图相关的问题,例如寻找所有可能路径、查找是否存在环路、计算连通分量、寻找割点和桥等。

  2. 连通性判断:DFS 可以用于判断图是否是连通的,即是否存在从一个节点到另一个节点的路径。如果遍历整个图时每个节点都被访问到,那么该图就是连通的。

  3. 路径搜索:DFS 可以用于搜索从一个节点到另一个节点的路径。例如,在迷宫中搜索从起点到终点的路径、在地图中搜索两个城市之间的最短路径等。

  4. 状态空间搜索:DFS 可以用于搜索问题的状态空间,例如在八皇后问题中,每个状态都是一个棋盘上的布局,使用 DFS 可以搜索所有可能的布局,找到其中的解。

  5. 生成树的构建:DFS 可以用于构建图的生成树,例如深度优先搜索生成树(DFS Tree),它是从起点开始访问所有可达节点的生成树。

总之,DFS 算法是一个非常常用和灵活的算法,它可以解决许多与图相关的问题。在实际应用中,我们可以根据具体的问题使用 DFS 算法进行解决。

下面是一个基于邻接表实现的 DFS 算法的 Java 代码,用于判断一个无向图是否是连通的。

import java.util.*;

class Graph {
    private int V;
    private LinkedList<Integer> adj[];

    Graph(int v) {
        V = v;
        adj = new LinkedList[V];
        for (int i = 0; i < V; i++) {
            adj[i] = new LinkedList<Integer>();
        }
    }

    void addEdge(int v, int w) {
        adj[v].add(w);
        adj[w].add(v);
    }

    void DFSUtil(int v, boolean visited[]) {
        visited[v] = true;

        Iterator<Integer> i = adj[v].listIterator();
        while (i.hasNext()) {
            int n = i.next();
            if (!visited[n]) {
                DFSUtil(n, visited);
            }
        }
    }

    boolean isConnected() {
        boolean visited[] = new boolean[V];
        Arrays.fill(visited, false);

        DFSUtil(0, visited);

        for (int i = 0; i < V; i++) {
            if (!visited[i]) {
                return false;
            }
        }

        return true;
    }
}

public class Main {
    public static void main(String args[]) {
        Graph g = new Graph(6);
        g.addEdge(0, 1);
        g.addEdge(0, 3);
        g.addEdge(1, 2);
        g.addEdge(1, 4);
        g.addEdge(2, 5);
        g.addEdge(3, 4);

        if (g.isConnected()) {
            System.out.println("Graph is connected");
        } else {
            System.out.println("Graph is not connected");
        }
    }
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值