BFS实现图的点的层次-java

news2024/11/24 11:48:14

加强对广度优先搜索的理解,其实就是主要的3个步骤,外加数组模拟单链表是基础,要搞懂。

目录

前言

一、图中点的层次

二、算法思路

1.广度优先遍历

 2.算法思路

三、代码如下

1.代码如下(示例):

2.读入数据:

3.代码运行结果:

总结


前言

加强对广度优先搜索的理解,其实就是主要的3个步骤,外加数组模拟单链表是基础,要搞懂。


提示:以下是本篇文章正文内容,下面案例可供参考

一、图中点的层次

给定一个 n个点 m条边的有向图,图中可能存在重边和自环。

所有边的长度都是 1,点的编号为 1∼n。

请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。

输入格式

第一行包含两个整数 n 和 m。

接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1的边。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

数据范围

1≤n,m≤100000

二、算法思路

1.广度优先遍历

图1.1广度优先搜索过程 

广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点,并将其标记为已访问过,然后将 图中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。

我们可以分为三个步骤:

  • (1)使用一个辅助队列 q,首先将顶点 v 入队,将其标记为已访问,然后循环检测队列是否为空。
  • (2)如果队列不为空,则取出队列第一个元素,并将与该元素相关联的所有未被访问的节点入队,将这些节点标记为已访问。
  • (3)如果队列为空,则说明已经按照广度优先遍历了所有的节点。

 注:宽度优先搜索(广度优先搜索)可以用来求权值为1的最短路。

 2.算法思路

图2.1邻接表存储无向图

我们还是通过邻接表的形式来存储图,并且用数组模拟单链表。我们用一维整型数组head来存储每一个结点对应的连的哪条边即head[i]中存储的是第i个结点对应的边的单链表。然后用一维整型数组e来存储每个结点对应的值是多少,一维整型数组ne来存储这个结点对应的下一个结点在e数组中的值对应的索引是多少,整型变量index来表示新创建的结点在e数组中的下标。

然后因为题中是有向图故只存储从起点到终点的一条边即可。

添加边例如a b即a指向b的边;我们只需在下标为a的单链表中插入值为b的结点即可。我们采用头插法。第一步创建一个新结点即e[index] = b;然后将原本在head数组中下标为a的单链表连接到新结点后面即ne[index] = head[a];再将头结点指向新结点head[a] = index;最后让index++,保证一直是在e数组中新创建的结点的下标。(注:head数组初始化全为-1表示单链表为空

有不明白的可以看我的数组模拟单链表这篇博客,里面有详细内容。

我们要求每个点到初始结点的距离且边的距离都是1,故我们需要一个一维整型数组dist来存储每个点到初始结点1之间的距离(初始化为-1)。需要一个队列来模拟bfs的过程,先将初始结点入队,然后做一个循环判断队列是否为空,队列不为空,弹出队头元素,对队头元素所在的单链表进行遍历,如果该结点没被访问过,让对应结点的距离数组中的值加1。最后dist[n]一定是初始结点1到最后一个结点n的最短距离。

注(dist[n]为-1就代表没有路径通向该结点。)

三、代码如下

1.代码如下(示例):


import java.io.*;
import java.util.*;

public class 图中点的层次 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(br);
    static int N = 100010;
    static int[] head = new int[N];
    static int[] e = new int[N];
    static int[] ne = new int[N];
    static int index;
    static int[] dist = new int[N];
    static Queue<Integer> q = new LinkedList<>();
    static int n,m;
    public static void main(String[] args) throws Exception{
        n = nextInt();
        m = nextInt();
        Arrays.fill(head,-1);
        while (m-- > 0){
            int a = nextInt();
            int b = nextInt();
            add(a,b);
        }
        pw.println(bfs());
        pw.flush();
    }
    //插入边
    public static void add(int a,int b){
        e[index] = b;
        ne[index] = head[a];
        head[a] = index;
        index++;
    }
    public static int bfs(){
        q.add(1);
        Arrays.fill(dist,-1);
        dist[1] = 0;
        while (!q.isEmpty()){
            Integer poll = q.poll();
            for(int i = head[poll]; i != -1; i = ne[i]){
                int j = e[i];
                if(dist[j] == -1){
                    dist[j]  = dist[poll] + 1;
                    q.add(j);
                }
            }
        }
        return dist[n];
    }
    public static int nextInt() throws Exception{
        st.nextToken();
        return (int)st.nval;
    }

}

2.读入数据:

4 5
1 2
2 3
3 4
1 3
1 4

3.代码运行结果:

1

总结

图中每个点的层次其实就是从初始结点到该点之间的最短距离,因为每个点之间的距离是1,故我们可以用bfs来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1806353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python教程】2-函数、逻辑运算与条件判断

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

0基础学习区块链技术——入门

大纲 区块链构成区块链相关技术Hash算法区块链区块链交易 参考资料 本文力求简单&#xff0c;不讨论任何技术细节&#xff0c;只是从简单的组成来介绍区块链技术&#xff0c;以方便大家快速入门。同时借助一些可视化工具&#xff0c;辅助大家有直观的认识。 区块链构成 顾名思…

一文掌握Vue3:深度解读Vue3新特性、Vue2与Vue3核心差异以及Vue2到Vue3转型迭代迁移重点梳理与实战

每次技术革新均推动着应用性能与开发体验的提升。Vue3 的迭代进步体现在性能优化、API重构与增强型TypeScript支持等方面&#xff0c;从而实现更高效开发、更优运行表现&#xff0c;促使升级成为保持竞争力与跟进现代前端趋势的必然选择。本文深度解读Vue3 响应式数据data、生命…

④-1单细胞学习-cellchat单数据代码补充版

目录 1&#xff0c;数据输入及处理 ①载入包和数据 ②CellChat输入数据准备 ③构建CellChat对象 ④数据预处理 2&#xff0c;细胞通讯预测 ①计算细胞通讯概率 ②提取配受体对细胞通讯结果表 ③提取信号通路水平的细胞通讯表 ④细胞互作关系可视化 1&#xff09;细胞…

服务器部署spring项目jar包使用bat文件,省略每次输入java -jar了

echo off set pathC:\Program Files\Java\jre1.8.0_191\bin START "YiXiangZhengHe-8516" "%path%/java" -Xdebug -jar -Dspring.profiles.activeprod -Dserver.port8516 YiXiangZhengHe-0.0.1-SNAPSHOT.jar 将set path后面改成jre的bin文件夹 START 后…

数据:人工智能的基石 | Scale AI 创始人兼 CEO 亚历山大·王的创业故事与行业洞见

引言 在人工智能领域&#xff0c;数据被誉为“新石油”&#xff0c;其重要性不言而喻。随着GPT-4的问世&#xff0c;AI技术迎来了新的浪潮。众多年轻创业者纷纷投身这一领域&#xff0c;Scale AI的创始人兼CEO亚历山大王&#xff08;Alexander Wang&#xff09;就是其中的佼佼…

推荐4个好用有趣的软件

MyComic——漫画聚合软件 MyComic是一款界面简洁、分类详尽的漫画阅读软件&#xff0c;专为动漫爱好者设计。它提供了丰富的高清漫画资源&#xff0c;支持在线免费阅读&#xff0c;并且可以一键下载到书架&#xff0c;方便随时离线观看&#xff0c;节省流量。用户可以轻松找到喜…

5分钟快速带了解fl studio21破解汉化版安装激活指南

随着数字音乐制作的快速发展&#xff0c;越来越多的音乐制作软件涌现出来&#xff0c;而FL Studio无疑是其中的佼佼者。作为一款功能强大、易于上手的音乐制作软件&#xff0c;FL Studio V21中文版在继承了前代版本优秀基因的基础上&#xff0c;进一步提升了用户体验&#xff0…

电脑回收站清空了怎么恢复回来?分享四个好用数据恢复方法

电脑回收站清空了还能恢复回来吗&#xff1f;在使用电脑过程中&#xff0c;很多小伙伴都不重视电脑的回收站,&#xff0c;有用的没用的文件都往里堆积。等空间不够的时候就去一股脑清空回收站。可有时候会发现自己还需要的文件在回收站里&#xff0c;可回收站已经被清空了……那…

IC元器件

1.电阻&#xff1a; 电阻的作用&#xff1a; 1.与负载串联&#xff1a;做限流分压 2.电阻并联&#xff1a;将小功率电阻并联成大功率&#xff0c;防烧毁 2.电容&#xff1a; 电容就是两块导体&#xff0b;中间的绝缘材料&#xff08;相当于两个人坐在一起加上中间的空…

基于vue的音乐播放器的设计与实现(论文+源码)_kaic

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

【Apache Doris】周FAQ集锦:第 5 期

【Apache Doris】周FAQ集锦&#xff1a;第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

Python第二语言(六、Python异常)

目录 1. 捕获异常&#xff08;try: except: else: finally:&#xff09; 1.1 概念 1.2 基础语法&#xff08;try&#xff1a; except&#xff1a;&#xff09; 1.3 捕获异常&#xff08;异常也有类型&#xff09; 1.4 捕获多个异常&#xff08;try&#xff1a;except(Name…

详解 Flink 的 ProcessFunction API

一、Flink 不同级别的 API Flink 拥有易于使用的不同级别分层 API 使得它是一个非常易于开发的框架最底层的 API 仅仅提供了有状态流处理&#xff0c;它将处理函数&#xff08;Process Function &#xff09;嵌入到了 DataStream API 中。底层处理函数&#xff08;Process Func…

Flutter项目开发模版,开箱即用

前言 当前案例 Flutter SDK版本&#xff1a;3.22.2 每当我们开始一个新项目&#xff0c;都会 引入常用库、封装工具类&#xff0c;配置环境等等&#xff0c;我参考了一些文档&#xff0c;将这些内容整合、简单修改、二次封装&#xff0c;得到了一个开箱即用的Flutter开发模版…

高速USB转串口芯片CH343

CH343封装 截止目前&#xff0c;主要封装有 SOP16: CH343G QFN16: CH343P ESSOP10: CH343K,截止24年6月未生产 CH343串口速度 最高串口速度&#xff1a; 6Mbps,比CH340的2M&#xff0c;快3倍 1、概述 参考版本&#xff1a;1E CH343 是一个 USB 总线的转接芯片&#xff0c;…

【MySQL】服务器配置和管理

本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序&#xff0c;负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…

Tensorflow入门实战 P03-天气识别

目录 1、完整代码 2、运行结果 2.1 查看20张图片 2.2 程序运行 2.3 运行结果 3、小结 ① 代码运行过程中有报错&#xff1a; ② 修改代码如下&#xff1a; ③ 分析原因&#xff1a; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&…

屏幕空间环境光遮蔽(SSAO)在AI绘画中的作用

引言&#xff1a; 随着人工智能技术的不断发展&#xff0c;AI绘画已经逐渐走进了人们的视野。作为一种新兴的艺术形式&#xff0c;AI绘画通过算法和模型来生成具有艺术感的图像。在这个过程中&#xff0c;屏幕空间环境光遮蔽&#xff08;SSAO&#xff09;技术发挥着重要作用。本…

英伟达的GPU(4)

更第四篇&#xff0c;上周有点私事&#xff0c;恢复更新 上次的文章 英伟达的GPU(3) (qq.com) 书接前文&#xff0c;我们上章说要更新GPU的内存机制&#xff0c;本次就讲点这个 先做个定义&#xff0c;我们说内存&#xff08;显存&#xff09;&#xff0c;也分物理内存&#…