Java 实现广度优先搜索和深度优先搜索

1. 综述

  复习算法数据结构,用Java 实现广度优先搜索和深度优先搜索。

2. 代码

要搜索的图为:

Java代码:

 1 package cn.edu.tju.scs;
 2
 3 import java.util.LinkedList;
 4 import java.util.Queue;
 5
 6 public class Search {
 7     public static boolean [] accessed = new boolean[8];
 8     public static boolean [] accessed2 = new boolean[8];
 9     public static ArcNode [] heads = new ArcNode[8];
10     public static Queue<Integer> queue = new LinkedList<Integer>();
11
12     public static void main(String [] args) {
13         for (int i = 0; i < heads.length; i++) {
14             heads[i] = new ArcNode(i + 1);    // 如果节点编号也从0开始就好了,少了很多加一减一的操作
15         }
16         for (int i = 0; i < accessed.length; i++) {
17             accessed[i] = false;
18         }
19         heads[0].nextArc = new ArcNode(2);
20         heads[0].nextArc.nextArc = new ArcNode(3);
21
22         heads[1].nextArc = new ArcNode(1);
23         heads[1].nextArc.nextArc = new ArcNode(4);
24         heads[1].nextArc.nextArc.nextArc = new ArcNode(5);
25
26         heads[2].nextArc = new ArcNode(1);
27         heads[2].nextArc.nextArc = new ArcNode(6);
28         heads[2].nextArc.nextArc.nextArc = new ArcNode(7);
29
30         heads[3].nextArc = new ArcNode(2);
31         heads[3].nextArc.nextArc = new ArcNode(8);
32
33         heads[4].nextArc = new ArcNode(2);
34         heads[4].nextArc.nextArc = new ArcNode(8);
35
36         heads[5].nextArc = new ArcNode(3);
37
38         heads[6].nextArc = new ArcNode(3);
39
40         heads[7].nextArc = new ArcNode(4);
41         heads[7].nextArc.nextArc = new ArcNode(5);
42
43         BroadFirstSearch(heads);
44         DepthFirstSearch(heads);
45     }
46
47     private static void BroadFirstSearch(ArcNode[] heads) {
48         BroadFirstSearch(heads[0]);
49     }
50
51     private static void BroadFirstSearch(ArcNode arcNode) {
52         queue.add(arcNode.adjvex);
53         accessed2[arcNode.adjvex - 1] = true;
54         while (queue.size() > 0) {
55             Integer vex = queue.remove();
56             ArcNode curNode = heads[vex - 1].nextArc;
57             while(curNode != null) {
58                 if (!accessed2[curNode.adjvex - 1]) {
59                     queue.add(curNode.adjvex);
60                     accessed2[curNode.adjvex - 1] = true;
61                 }
62                 curNode = curNode.nextArc;
63             }
64             System.out.print(vex);
65             if (queue.size() > 0)
66                 System.out.print(" -> ");
67             else
68                 System.out.println("");
69         }
70     }
71
72     private static void DepthFirstSearch(ArcNode[] heads) {
73         DepthFirstSearch(heads[0]);
74     }
75
76     private static void DepthFirstSearch(ArcNode arcNode) {
77         ArcNode curNode = heads[arcNode.adjvex-1];
78         System.out.print(curNode);
79         accessed[curNode.adjvex -1] = true;
80
81         curNode = curNode.nextArc;
82         while(curNode != null) {
83             if (!accessed[curNode.adjvex - 1]){
84                 System.out.print(" -> ");
85                 DepthFirstSearch(curNode);
86             }
87             curNode = curNode.nextArc;
88         }
89     }
90 }

输出结果:

(广搜:)1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
(深搜:)1 -> 2 -> 4 -> 8 -> 5 -> 3 -> 6 -> 7

时间: 2024-08-27 14:10:58

Java 实现广度优先搜索和深度优先搜索的相关文章

【图论】广度优先搜索和深度优先搜索

写在最前面的 这篇文章并没有非常详细的算法证明过程.导论里面有非常详细的证明过程.本文只阐述“广度优先和深度优先搜索的思路以及一些简单应用”. 两种图的遍历算法在其他图的算法当中都有应用,并且是基本的图论算法. 广度优先搜索 广度优先搜索(BFS),可以被形象的描述为“浅尝辄止”,具体一点就是每个顶点只访问它的邻接节点(如果它的邻接节点没有被访问)并且记录这个邻接节点,当访问完它的邻接节点之后就结束这个顶点的访问. 广度优先用到了“先进先出”队列,通过这个队列来存储第一次发现的节点,以便下一次的

总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时,因为每条边只访问一次,不会重复访问,所以总复杂度为O(V+E) 深度优先搜索(DFS) for each vertex u∈V(G)    //执行时间为O(V) DFS(u) DFS内部: for each v 为u的邻接点      //执行时间为O(E) DFS(v) 总执行时间为O(V+E)

图的优先遍历:广度优先搜索和深度优先搜索

广度优先搜索,该算法是将已发现结点和未发现结点之间的边界,沿着其广度方向向外扩展,算法需要发现所有距离源结点 s 为 k 的所有结点之后,才会发现距离源结点 s 为 k+1 的其他结点.如果结点都被访问,算法终止. 此过程需要先构建一颗广度优先树.一开始,该树只有根结点 s (源节点).在扫描已发现结点 s 的邻接表时,每发现一个白色结点 v,就把结点染黑(这是为了记录访问的痕迹),并把它们之间的边(u, v)加入广度优先树. 该算法使用了一个具有 FIFO 特性的队列来管理已知和未知两个集合之

有关搜索和深度优先搜索的浅陋见解

祝食用愉快XD 题目链接 (是一道胡乱出的题) U56815 来走迷宫鸭! 解题思路 深度优先搜索,如果能不碰墙地到达右下角的出口,就把旗子立起来表示找到了出口. 什么?你没听过深度优先搜索 没事,且听我道来. 什么是搜索?如何搜索? 简单来说,搜索就是一种特殊的(递归的)枚举.从一种可行的方案进行扩展,并去看这个扩展出来的东西符不符合现有规则.能不能继续扩展. 可是你讲理论我也听不懂啊 那,深度优先搜索又是什么呢? 拿走迷宫这事儿说起.如果你玩过\(MC\),或者无论从哪个去掉了解走迷宫的时候

图的表示、广度优先搜索、深度优先搜索

1.图的表示 a.邻接矩阵:适合稠密图(|E|接近|V|2) //用二维数组表示邻接矩阵 int G[|V|][|V|]; //初始化 for(int i=0;i<|V|;i++){ for(int j=0;j<|V|;j++){ if( (i,j) in E){ G[i][j] = 1;//or G[i][j] = weight[i][j]; } else if(i==j){ G[i][j] = 0; } else{ G[i][j] = MAX; } } } b.邻接表:适合稀疏图(|E|远

【算法】图的广度优先搜索和深度优先搜索

我们构建一张如下的图: 直接上代码: package main; import java.util.ArrayList; public class Node { private String name = ""; public ArrayList<Node> neighbor = new ArrayList<>(); public boolean flag = false; public Node(String name){ this.name = name;

广度优先搜索、深度优先搜索

package com.tyson.graph; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class GraphMatrix { private ArrayList<Integer> vertexList; private int[][] edges; private int edgesNum; public GraphMatrix(int n) { edge

算法-无向图(深度优先搜索和广度优先搜索)

图中最常用到的两种搜索深度优先搜索和广度优先搜索,深度优先搜索是一种在开发爬虫早期使用较多的方法它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链接的Html文件) ,广度搜索属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止. 深度优先搜索 图中我们经常会遇到一个问题就是图的连通性,比如说从一个顶点到另外一个顶点,判断顶点和其他顶点之间的连通性,以下图为例: 搜索API定义: @interface

&quot;《算法导论》之‘图’&quot;:深度优先搜索、宽度优先搜索及连通分量

本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步.  1. 深度优先搜索  1.1 迷宫搜索 在<算法>这本书中,作者写了很好的一个故事.这个故事让我马上理解了深度优先搜索的思想. 如下图1-1所示,如何在这个迷宫中找到出路呢?方法见图1-2. 图1-1 等价的迷宫模型 探索迷宫而不迷路的一种古老办法(至少可以追溯到忒修斯和米诺陶的传说)叫做Tremaux搜