当前位置:   article > 正文

java dfs 算法_javadfs算法

javadfs算法

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

  1. import java.util.*;
  2. public class Graph {
  3. private int V; // 图中节点的数量
  4. private LinkedList<Integer>[] adj; // 邻接表
  5. // 构造函数
  6. Graph(int v) {
  7. V = v;
  8. adj = new LinkedList[v];
  9. for (int i = 0; i < v; ++i)
  10. adj[i] = new LinkedList();
  11. }
  12. // 添加一条边到图中
  13. void addEdge(int v, int w) {
  14. adj[v].add(w);
  15. }
  16. // 使用 DFS 遍历图中所有节点
  17. void DFS(int v, boolean[] visited) {
  18. visited[v] = true;
  19. System.out.print(v + " ");
  20. Iterator<Integer> i = adj[v].listIterator();
  21. while (i.hasNext()) {
  22. int n = i.next();
  23. if (!visited[n])
  24. DFS(n, visited);
  25. }
  26. }
  27. // 对给定起点进行 DFS 遍历
  28. void DFS(int v) {
  29. boolean[] visited = new boolean[V];
  30. DFS(v, visited);
  31. }
  32. public static void main(String args[]) {
  33. Graph g = new Graph(4);
  34. g.addEdge(0, 1);
  35. g.addEdge(0, 2);
  36. g.addEdge(1, 2);
  37. g.addEdge(2, 0);
  38. g.addEdge(2, 3);
  39. g.addEdge(3, 3);
  40. System.out.println("从起点 2 开始遍历:");
  41. g.DFS(2);
  42. }
  43. }

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

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

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

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

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

  1. 从起点 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 代码,用于判断一个无向图是否是连通的。

  1. import java.util.*;
  2. class Graph {
  3. private int V;
  4. private LinkedList<Integer> adj[];
  5. Graph(int v) {
  6. V = v;
  7. adj = new LinkedList[V];
  8. for (int i = 0; i < V; i++) {
  9. adj[i] = new LinkedList<Integer>();
  10. }
  11. }
  12. void addEdge(int v, int w) {
  13. adj[v].add(w);
  14. adj[w].add(v);
  15. }
  16. void DFSUtil(int v, boolean visited[]) {
  17. visited[v] = true;
  18. Iterator<Integer> i = adj[v].listIterator();
  19. while (i.hasNext()) {
  20. int n = i.next();
  21. if (!visited[n]) {
  22. DFSUtil(n, visited);
  23. }
  24. }
  25. }
  26. boolean isConnected() {
  27. boolean visited[] = new boolean[V];
  28. Arrays.fill(visited, false);
  29. DFSUtil(0, visited);
  30. for (int i = 0; i < V; i++) {
  31. if (!visited[i]) {
  32. return false;
  33. }
  34. }
  35. return true;
  36. }
  37. }
  38. public class Main {
  39. public static void main(String args[]) {
  40. Graph g = new Graph(6);
  41. g.addEdge(0, 1);
  42. g.addEdge(0, 3);
  43. g.addEdge(1, 2);
  44. g.addEdge(1, 4);
  45. g.addEdge(2, 5);
  46. g.addEdge(3, 4);
  47. if (g.isConnected()) {
  48. System.out.println("Graph is connected");
  49. } else {
  50. System.out.println("Graph is not connected");
  51. }
  52. }
  53. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/476057
推荐阅读
相关标签
  

闽ICP备14008679号