Java实现深度优先和宽度优先搜索(图遍历)

news/2024/7/20 20:01:49 标签: java, 深度优先, 宽度优先

深度优先宽度优先搜索
本质是一种图遍历/搜索算法。

深度优先(DFS)
对于新发现的顶点,若该点还有以此为起点的为探测到的边,则沿着这条边继续探测下去(明显是个递归过程)。当顶点v所有边都已被探寻过后,搜索将回到发现顶点v有起始的那些边。此过程一直进行到已发现从源顶点可达的所有顶点为止。

宽度优先(BFS)
当访问顶点v时,记录其所有未被访问的相邻顶点(加入待访问队列中),然后结束这个顶点v的访问。接着从待访问队列中取出队头 顶点,作为下一个访问顶点,重复上述过程,直至队列为空!

import java.util.*;

/*定义图中的节点的数据结构*/
class Node {
    int val;                // 节点数据
    List<Node> neighbours;  // 相邻其他节点

    public Node(int x) {
        val = x;
        neighbours = new ArrayList<Node>();
    }
}

public class Code1 {
    public static void main(String[] args) {
        Node begin = createGraph();
        Set<Node> visited = new HashSet<>();
        System.out.println("DFS:");
        DFS(begin, visited);
        System.out.println("BFS:");
        BFS(begin);
    }

    /* 创建图,返回一个节点 */
    public static Node createGraph() {
        Node v1 = new Node(1);
        Node v2 = new Node(2);
        Node v3 = new Node(3);
        Node v4 = new Node(4);
        Node v5 = new Node(5);
        Node v6 = new Node(6);
        Node v7 = new Node(7);
        Node v8 = new Node(8);

        v1.neighbours.add(v2);
        v1.neighbours.add(v3);
        v1.neighbours.add(v4);
        v1.neighbours.add(v5);

        v2.neighbours.add(v6);
        v2.neighbours.add(v7);

        v4.neighbours.add(v8);
        return v1;
    }

    /**
     * 深度优先
     *
     * @param v       源顶点
     * @param visited 集合类型,记录所有已访问顶点
     */
    public static void DFS(Node v, Set<Node> visited) {
        if (visited.contains(v))
            return;
        else {
            System.out.println("Visit node:" + v.val);
            visited.add(v);
            for (Node next : v.neighbours) {
                DFS(next, visited);
            }
        }
    }

    /**
     * 宽度优先
     *
     * @param v 源顶点,即出发顶点
     */
    public static void BFS(Node v) {
        Set<Node> visited = new HashSet<>();
        Queue<Node> queue = new LinkedList<>();
        queue.offer(v);     // 入队列
        while (!queue.isEmpty()) {
            Node node = queue.poll();   // 出队列并删除
            if (!visited.contains(node)) {
                System.out.println("Visit node:" + node.val);
                visited.add(node);
                for (Node next : node.neighbours) {
                    queue.offer(next);
                }
            }
        }
    }
}

输出:

DFS:
Visit node:1
Visit node:2
Visit node:6
Visit node:7
Visit node:3
Visit node:4
Visit node:8
Visit node:5
BFS:
Visit node:1
Visit node:2
Visit node:3
Visit node:4
Visit node:5
Visit node:6
Visit node:7
Visit node:8


http://www.niftyadmin.cn/n/486329.html

相关文章

python关键字提取源码_使用Python对视频任意矩形区域进行裁剪

封面图片&#xff1a;《Python程序设计实验指导书》(ISBN&#xff1a;9787302525790)&#xff0c;董付国&#xff0c;清华大学出版社图书详情(京东)&#xff1a;本书81个实验项目可与董付国老师的《Python程序设计(第2版)》、《Python程序设计基础(第2版)》、《Python程序设计基…

hibernate-mapping的各种属性配置

先给出一份常见的持久化类配置文件大概熟悉一下 <strong><spanstyle"font-size: 18px;"><hibernate-mapping> <classname"zyw.app.domain.Person1"> <idname"id"type"java.lang.Integer"> …

0xc0000225无法进系统_发动机电控系统真有那么复杂?看完这个就明白很多了!...

01发动机电子控制系统组成发动机电子控制系统也称发动机管理系统。发动机电子控制系统由控制单元(ECU)或称为发动机控制模块(ECM)、传感器、执行器三部分组成。大众1.4T 发动机电控系统如下图所示 ▼02控制信号和组成03电子节气门电子节气门系统是将加速踏板操作转换成电气信号…

什么原因导致芯片短路_防火涂料什么原因导致结块

伊俐信_cccf_3c认证_消防认证​www.yilixincccf.com防火涂料的特点是能很好地避免火势蔓延&#xff0c;所采用的结构非常特殊&#xff0c;能起到控制作用&#xff0c;避免火势蔓延到不应发生的区域。事实上&#xff0c;防火涂料的质量主要取决于防火性能和防火涂料的理化性能。…

二分查找向上还是向下取整_要变盘了,向上还是向下?

​本文首发12月6日1、迦南看市本周权重行情是大金融和大消费轮动。医药走V字反弹&#xff0c;一周涨幅7%&#xff1b;消费主要还是白酒和酱油的拉升。军工继续承接上周涨势&#xff0c;大金融则有冲高回落之意。目前指数处于变盘边缘。向上还是向下&#xff0c;大概率下周一、二…

window.open如何实现窗口关闭数据回传

1.打开新窗口时增加事件监听 // 弹框数据回调监听btn.addEventListener(click, function () {const fdId chooseAreaExpert();if(fdId){var url; //转向网页的地址;var name; //网页名称&#xff0c;可为空;var iWidth…