BFS实现图的点的层次-java

加强对广度优先搜索的理解,其实就是主要的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.mzph.cn/pingmian/25553.shtml

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

相关文章

探索基于订阅式的电视App:Android TV 端强大的开源视频播放器

探索基于订阅式的电视App&#xff1a;Android TV 端强大的开源视频播放器 在智能电视和流媒体日益普及的今天&#xff0c;一款强大的视频播放器是家庭娱乐的重要组成部分。正是这样一款为Android TV设计的开源视频播放器。本文将深入探讨电视盒子OSC的技术特点、使用方法以及其…

在Java中类中的成员变量和成员方法在jvm中如何协调调用及优化

第一部分&#xff1a; 在Java中类中的成员变量和成员方法在jvm中如何协调调用 在Java中&#xff0c;类的成员变量和成员方法在JVM&#xff08;Java虚拟机&#xff09;中的表现方式有一定的规则和结构。以下是对成员变量和成员方法在JVM中的一些关键点的解释&#xff1a; 成员…

抛弃昂贵BI,企业仍可低成本实现数据分析

有的读者看完《BI工具选型不入坑&#xff0c;你要这么选》这篇文章就陷入迷茫了&#xff0c;我要做企业级数据分析&#xff0c;看过去各家产品都各有千秋&#xff0c;实在难以抉择&#xff0c;或者已经选了仍是纠结不已。 这里我抛出另一种思路&#xff1a;如果不用BI&#xf…

Terminal Multiplexer的使用

tmux&#xff08;Terminal Multiplexer&#xff0c;终端复用器&#xff09;是一个可以在单个终端窗口中运行多个独立会话的软件工具。它允许用户在同一个终端窗口内分割屏幕&#xff0c;创建多个虚拟终端&#xff0c;这样就可以同时监视和控制多个进程&#xff0c;即使终端窗口…

C#操作MySQL从入门到精通(17)——使用联结

前言: 我们在查询数据的过程中有时候查询的数据不是来自一个表而是来自多个表,本文使用的测试数据如下: 本文使用了两个表student_info、address_info student_info的数据如下: address_info的数据如下: 1、内联结 所谓内联结就是求交集,两个表都有的数据才是有效数…

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

46.django - 多语言配置

1.Django 多语言基础知识 多语言站点可以让不同语言的用户更好地使用和理解网站内容&#xff0c;提升用户体验和覆盖范围。为了实现多语言功能&#xff0c;我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分&#xff0c;感兴趣的可以看看。直接跳过…

安装搭建java版的悟空crm遇到 网络错误请稍候再试 终极解决办法(hrm人力资源模块)

java版 项目目录 ├── build – webpack 配置文件 ├── config – 项目配置文件 ├── src – 源码目录 │ ├── api – axios请求接口 │ ├── assets – 静态图片资源文件 │ ├── components – 通用组件 │ ├── directives – 通用指令 │ ├── filters –…

项目中的任务调度和消息队列方案详解

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 任务…

软件项目调研三部曲(调研计划,调研大纲,调研报告)原件获取

软件项目详细调研的目的是依据项目合同的要求&#xff0c;能够通过在客户现场&#xff0c;并通过访谈的方式&#xff0c;尽可能的了解客户的需求和业务现状&#xff0c;包括客户涉及到的业务部门的岗位设置、岗位职责、工作内容、工作流程、管理难点以及通过实施信息化系统的期…

GDPU Java 天码行空15 数据库编程

一、实验目的 1、 了解数据库的基础知识。 2、 掌握MySQL的下载、安装与配置。 3、 掌握MySQL可视化工具的使用。 4、 了解SQL语言。 5、 掌握JDBC中的API&#xff0c;并能进行简单的数据库操作。 二、实验内容 1、 安装MySQL &#x1f468;‍&#x1f3eb; 视频教程 2、建…

华为云加码数智升级 赋能山西培育新质生产力

加码企业数智升级&#xff0c;驱动山西新质生产力跃升。6月4日&#xff0c;“云上共创晋而有为”华为云山西数智升级思享会在山西智创城NO.1创新孵化基地举办。 活动由华为云计算技术有限公司主办&#xff0c;太原清控科创科技园管理有限公司协办。活动整合山西鲲鹏生态创新中…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

怎么开发vscode插件

开发VSCode插件主要涉及到JavaScript、TypeScript和Node.js。以下是一个基本的步骤&#xff1a; 环境准备&#xff1a;首先&#xff0c;你需要安装Node.js和VSCode。你还需要全局安装VSCode插件开发工具yo code。在命令行中运行以下命令&#xff1a; npm install -g yo generat…

Cocos2dx 编译游戏安装包制作教程

在本教程中&#xff0c;我们将学习如何为 Visual Studio 编译项目配置图标&#xff0c;并使用 Inno Setup 创建安装包。我们将包括以下部分&#xff1a; 设置项目图标&#xff1a;在 Visual Studio 中配置 .exe 文件的图标&#xff0c;或者使用第三方工具替换编译后的图标。创…

简记:为Docker配置服务代理

简记 为Docker配置服务代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/art…

网络流媒体协议——HLS协议

HTTP 实时流媒体&#xff08;HTTP Live Streaming&#xff0c;HLS&#xff09;协议是苹果公司提出的主要用于直播的流媒体协议。一个完整的基于HLS协议的流媒体直播系统由四部分组成&#xff0c;即音视频采集器、媒体服务器、媒体分发器和播放客户端。 媒体服务器 媒体服务器的…

深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss

深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss flyfish 本系列的主要内容是在2017年所写&#xff0c;GPT使用了交叉熵损失函数&#xff0c;所以就温故而知新&#xff0c;文中代码又用新版的PyTorch写了一遍&#xff0c;在看交叉熵损失函数遇到问题时&#xff0c;可…

小冬瓜AIGC 手撕LLM 拼课

小冬瓜aigc手撕LLM学习 官方认证 手撕LLMRLHF速成班-(附赠LLM加速分布式训练超长文档&#xff09; 帮助多名同学上岸LLM方向&#xff0c;包括高校副教授&#xff0c;北美PhD&#xff0c;大厂等 课程名称【手撕LLMRLHF】 授课形式&#xff1a;在线会议直播讲解课后录播 时间&…

oppo手机精简包名列表

oppo广告机&#xff0c;coloros为13.0&#xff0c;测试机为oppo a1x 5g。 手机第一次开机后就全屏广告&#xff0c;被恶心了好几个月。现使用universal Android debolater进行卸载测试&#xff0c;其中&#xff1a; 不可卸载的&#xff1a; 开机广告&#xff1a;com.coloros.…