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

我们构建一张如下的图:

直接上代码:

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;
    }

    public void addNeighbor(Node... nodes){
        if(nodes != null){
            for(Node temp:nodes){
                neighbor.add(temp);
            }
        }
    }

    public String getName(){
        return name;
    }
}
 1 package main;
 2
 3 import java.util.ArrayList;
 4 import java.util.LinkedList;
 5 import java.util.Queue;
 6 import java.util.Stack;
 7 import java.util.concurrent.ExecutorService;
 8 import java.util.concurrent.Executors;
 9 import java.util.concurrent.locks.Condition;
10 import java.util.concurrent.locks.Lock;
11 import java.util.concurrent.locks.ReentrantLock;
12
13 public class Main {
14     public static void main(String[] args){
15         Node a = new Node("A");
16         Node b = new Node("B");
17         Node c = new Node("C");
18         Node d = new Node("D");
19         Node e = new Node("E");
20         Node f = new Node("F");
21         Node g = new Node("G");
22         Node h = new Node("H");
23         Node i = new Node("I");
24
25         a.addNeighbor(b,f);
26         b.addNeighbor(a,g,i,c);
27         c.addNeighbor(b,i,d);
28         d.addNeighbor(c,i,g,h,e);
29         e.addNeighbor(d,h,f);
30         f.addNeighbor(a,g,e);
31         h.addNeighbor(g,d,e);
32         i.addNeighbor(b,c,d);
33
34         //深度优先
35         Stack<Node> stack = new Stack<>();
36         stack.push(a);
37         a.flag = true;
38         while(!stack.isEmpty()){
39             Node curNode = stack.pop();
40             System.out.print(curNode.getName());
41             for(Node temp:curNode.neighbor){
42                 if(temp.flag == false){
43                     stack.push(temp);
44                     temp.flag = true;
45                 }
46             }
47         }
48         System.out.println("\n");
49
50         a.flag = false;
51         b.flag = false;
52         c.flag = false;
53         d.flag = false;
54         g.flag = false;
55         e.flag = false;
56         f.flag = false;
57         h.flag = false;
58         i.flag = false;
59
60         //广度优先
61         Queue<Node> queue = new LinkedList<>();
62         queue.offer(a);
63         a.flag = true;
64         while(!queue.isEmpty()){
65             Node curNode = queue.poll();
66             System.out.print(curNode.getName());
67             for(Node temp:curNode.neighbor){
68                 if(temp.flag == false){
69                     queue.offer(temp);
70                     temp.flag = true;
71                 }
72             }
73         }
74
75         System.out.print("\n");
76     }
77
78 }

输出结果分别为:

AFEHDICGB

ABFGICEDH

原文地址:https://www.cnblogs.com/yanyojun/p/9488759.html

时间: 2024-07-28 20:40:36

【算法】图的广度优先搜索和深度优先搜索的相关文章

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

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

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

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 [

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

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

总结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)

图的邻接表法深度优先搜索

# include <stdio.h> # include <stdlib.h> # define True 1 # define False 0 # define Error -1 # define OK 1 # define MAX_VERTEX_NUM 20 int visited[MAX_VERTEX_NUM];                       //定义标志数组 typedef char VertexData; typedef enum{DG,DN,UDG,UD

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

祝食用愉快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|远

python数据结构与算法——图的广度优先和深度优先的算法

根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打开,从一个门进去继续打开里面的门,然后返回前一个门处 1 """ 2 procedure BFS(G,v) is 3 let Q be a queue 4 Q.enqueue(v) 5 label v as discovered 6 while Q is not empty 7