hnust 1966: 广度优先搜索

hnust 1966: 广度优先搜索

题目描述
输入一个图,用邻接表存储(实际上也可以选择邻接矩阵),并实现BFS操作。

拷贝前面已经实现的代码,主函数必须如下,完成剩下的部分。

int main()
{
Graph g;
CreateUDG(g);
BFS(g, 0);//从0号顶点开始遍历
DestroyUDG(g);
return 0;
}//main

输入
输入的第一行是两个整数,分别是图的总顶点数n和总边数e

第二行是n个空格分开的字符串,是顶点的名字,依次对应编号0~n-1。

随后有e行,每行两个空格分开的顶点名字,表示一条边的两个顶点。

具体见样例。

输出

输出图的BFS序列,遍历次序按教材,每个顶点后面跟一个空格。

具体见样例。

样例输入 Copy
8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v2 v5
v3 v6
v3 v7
v4 v8
v5 v8
v6 v7
样例输出 Copy
v1 v2 v3 v4 v5 v6 v7 v8
提示
样例对应教材6.5的图G4

解题过程

注:本题按照书上算法解析完成,广度优先搜索的细化代码及函数分解请看合集《2024.6 hnust 23级 数据结构 课程设计》“推箱子游戏-广度优先搜索版本”
图的广度优先搜索(BFS)需要借助到队列来遍历:
①首先,选取图中某一顶点vi作为出发点,访问后将其入队并标记为已访问(使用队列用于避免重复访问,存放已经访问过的各邻接顶点);
②依次访问与vi邻接的顶点,即当队列不为空时检查出队顶点的所有邻接顶点,访问未被访问的邻接顶点并将其入队,重复该过程;【可概括为由起始顶点开始,按照广度优先的顺序逐层遍历与当前顶点相邻的顶点将其访问】
③当队列为空时跳出循环,即所有已被访问的顶点的邻接顶点均被访问到,则此时遍历完成。

(二)BFS的空间复杂度和时间复杂度
对于一个图G=(V,E),由顶点集V和边集E组成。
1、BFS算法的空间复杂度
通过BFS遍历的空间复杂度为O(|V|)。

2、BFS算法的时间复杂度
时间复杂度取决于图的存储结构,若通过邻接矩阵表示图,则查找顶点的邻接顶点所需时间为O(|V|),总时间复杂度为O(|V2|)(邻接矩阵为方阵n×n),这和DFS算法的时间复杂度是一样的;若通过邻接表表示图,则每个顶点都入队一次,即所需时间为O(|V|),搜索顶点的邻接顶点所需时间为O(|E|),其时间复杂度为O(|V|+|E|)。

这段C++代码实现了一个基于广度优先搜索(BFS)的无向图的拓扑排序算法。以下是对代码的详细解析:

  1. 头文件和命名空间

    • 包含 <bits/stdc++.h> 头文件,它包含了标准库中的大部分内容。
    • 使用 using namespace std; 来避免在标准库类型和函数前加 std::
  2. 读取图的参数

    • 读取两个整数 ne,分别代表图中顶点的数量和边的数量。
  3. 存储顶点信息

    • 创建一个字符串数组 nodes 来存储顶点的名称。
  4. 输入顶点名称

    • 使用循环读取 n 个顶点的名称。
  5. 建立顶点位置映射

    • 使用 map(映射)来存储每个顶点名称与其在数组中的索引位置。
  6. 创建无向图

    • 使用 map 来创建一个邻接表 G,表示无向图中的边。
  7. 对邻接表进行排序

    • 对每个顶点的邻接表进行排序,以便在后续的搜索中按顺序访问。
  8. 初始化访问标记

    • 使用 map 初始化所有顶点的访问状态为未访问。
  9. 使用队列实现BFS

    • 使用 queue 来实现BFS,首先将起始顶点压入队列,并标记为已访问。
  10. BFS搜索

    • 当队列不为空时,执行循环:
      • 弹出队列前端元素作为当前访问的顶点,并输出。
      • 遍历当前顶点的所有邻接顶点。
      • 如果邻接顶点未被访问,将其标记为已访问,并压入队列。
  11. 输出访问顺序

    • 在访问过程中,每访问一个顶点,就输出其名称。
  12. 程序结束

    • 当队列为空时,表示所有顶点都被访问完毕,程序结束。

代码逻辑分析

  • 这段代码通过BFS实现了拓扑排序,适用于无向图。
  • 使用队列来存储待访问的顶点,使用映射来记录顶点的访问状态和位置信息。

潜在问题

  • 代码中注释掉的部分提供了另一种实现拓扑排序的方法,但在当前实现中未使用。

改进建议

  • 考虑使用 std::vector 替代数组,以提高代码的安全性和灵活性。
  • 考虑使用 std::unordered_map 替代 std::map,以提高查找效率。
  • 如果需要处理更大的图或更复杂的图结构,可以考虑优化内存使用和搜索算法。
  • 代码中的排序部分可能不是必要的,因为拓扑排序的目的是线性化图,而不是排序顶点。如果不需要对顶点进行排序,可以省略排序逻辑。

AC代码

#include<bits/stdc++.h>
using namespace std;int main(int argc, char const *argv[])
{map < string , std::vector<string> >  G;int n ,e;cin>> n >> e;  //输入:8 9string nodes[n];for (int i = 0; i < n; ++i){cin >> nodes[i];  //输入:v1 v2 v3 v4 v5 v6 v7 v8}map <string , int > location;for (int i = 0; i < n; ++i)   //排序数组{location[nodes[i]] = i;}for (int i = 0; i < e; ++i)  //创建无向图{string l,r;cin >> l >> r;G[l].push_back(r);G[r].push_back(l);}for (int i = 0; i < n; ++i)  //对无向图的排序{int j = G[nodes[i]].size();for (int p = 0; p < j; ++p){for (int q = 0; q < j; ++q){if(location[G[nodes[i]][q]] > location[G[nodes[i]][p]]){string temp;temp = G[nodes[i]][q];G[nodes[i]][q] = G[nodes[i]][p];G[nodes[i]][p] = temp;}}}}map < string , bool > vis;  //是否被访问queue < string > q;q.push(nodes[0]);vis[nodes[0]] = true;// string rev[n];// int r = 0;while(q.size()){string curr;curr = q.front();  q.pop();// rev[r++] = curr;cout << curr << " ";for(auto next : G[curr]){if(!vis[next]){vis[next] = true;q.push(next);}}}return 0;
}

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

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

相关文章

ffmpeg 文档 - 未完

写在前面: 笔记的目录是为了总结他人的话, 从而让自己更专注阅读理解与框架思路整理, 忌大而详细。 原文: ffmpeg 文档 1 概要 ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...ffmpeg 是一个通用的 媒体转换器. 读…

ChatGPT对话:python程序模拟操作网页弹出对话框

【编者按】单击一网页中的按钮&#xff0c;弹出对话框网页&#xff0c;再单击其中的“Yes”按钮&#xff0c;对话框关闭&#xff0c;请求并获取新网页。 可能ChatGPT第一次没有正确理解描述问题的含义&#xff0c;再次说明后&#xff0c;程序编写就正确了。 1问&#xff1a;pyt…

全网最全的接口文档速成

文章目录 接口文档内容前言1. 前后端分离开发1.1 介绍1.2 开发流程1.3 前端技术栈 2. Yapi2.1 介绍2.2 使用2.2.1 准备2.2.2 定义接口2.2.3 导出接口文档2.2.4 导入接口文档 3. Swagger3.1 介绍3.2 使用方式3.3 查看接口文档3.4 常用注解3.4.1 问题说明3.4.2 注解介绍3.4.3 注解…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程&#xff0c;当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

【代码随想录算法训练营第六十三天|卡码网117.软件构造、47.参加科学大会】

文章目录 117.软件构造47.参加科学大会 117.软件构造 本体考察的是拓扑排序的思路&#xff0c;对于所有的有向无环图进行拓扑排序后输出的长度一定是和原结点数相同的。整体思路是找到当前所有的入度为0的结点&#xff0c;添加到结果中&#xff0c;并且查看对应的后续结点将其…

文献笔记|综述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 题目&#xff1a;当大型语言模型遇到优化时 作者&#xff1a;Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 来源&#xff1a;arXiv 单位&#xff1a;华南理工大学 文章目录 When Large Language Model Meets Optimization…

springboot打包异常 Type org.springframework.boot.maven.RepackageMojo not present

解决&#xff1a; 项目在本地时可以正常启动的,但是打包就报错,经过分析得出,应该是打包依赖的问题,解决方法: 在pom文件中的build—>plugins---->plugin中添加spring-boot-maven-plugin依赖的版本号如下: 2.4.3 指定版本号即可。

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知&#xff0c;今年8月1日&#xff0c;CISA新版考纲正式上线&#xff0c;旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版&#xff0c;中文版尚未发布。我们艾威经验丰…

Jetson-AGX-Orin多网卡绑定网卡名

Jetson-AGX-Orin多网卡绑定网卡名 ​ Jetson-AGX-Orin当通过USB接口或者Type-C口插入网卡设备后&#xff0c;重新上电Orin设备后&#xff0c;网卡设备的网卡名与Orin本身的以太网网卡名会发生交换。导致两个网卡设备配置发生错乱&#xff0c;两个网卡都将不通。 可以通过将网…

出道即包揽多项荣誉,Shokz韶音OpenFit Air拿下日本VGP金奖

说到盛夏的日本&#xff0c;你会想到什么&#xff1f;花火大会&#xff1f;但对于消费电子行业来讲&#xff0c;日本每年发布的VGP Summer奖项&#xff0c;才是每年盛夏时节行业内最大的庆典。而在今年的VGP 2024 Summer评选中&#xff0c;Shokz韶音在今年4月份刚发布的开放式耳…

开放式耳机音质哪个品牌的好?盘点几款音质好品牌

在音乐的世界里&#xff0c;每一分贝的振动都承载着情感与故事。对于追求极致音质体验的我们来说&#xff0c;耳机不仅是聆听的工具&#xff0c;更是通往音乐灵魂深处的桥梁。而开放式耳机&#xff0c;以其独有的声学构造和听觉享受&#xff0c;引领我们进入一个更为开阔的音乐…

ChatGPT 5.0:一年后的猜想

对于ChatGPT 5.0在未来一年半后的展望与看法&#xff0c;我们可以从以下几个方面进行详细探讨&#xff1a; 一、技术提升与功能拓展 语言翻译能力&#xff1a; ChatGPT 5.0在语言翻译方面有望实现更大突破。据推测&#xff0c;新版本将利用更先进的自然语言处理技术和深度学习…

ONNX加载模型问题总结

输入参数类型问题 run函数的参数列表如下&#xff1a; SessionImpl::Run(const Ort::RunOptions&, const char* const*, const Ort::Value*, size_t, const char* const*, Ort::Value*, size_t) 注意需要输入输出的参数名字形式是const char* const* 方式1 const char* 数…

vue中,图片在div中按照图片原来大小等比例显示

图片在div中按照图片原来大小等比例显示&#xff0c;可以保证web上显示的图片和实际图片形状一样&#xff0c;保留原始图片效果 实现代码如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

如何探索高效知识管理:FlowUs知识库体验很好

在当今信息爆炸的时代&#xff0c;有效的知识管理对于个人和团队的发展至关重要。FlowUs 知识库作为一款创新的知识管理工具&#xff0c;正逐渐成为众多用户的首选&#xff0c;为他们带来了高效、便捷和有条理的知识管理体验。 FlowUs 知识库的一大特色在于其简洁直观的界面设计…

【ai_agent】从零写一个agent框架(五)基于egui制作一个agent/workflow在线编辑器

前言 上篇我们实现了基础节点&#xff0c;并暴露出grpc服务&#xff0c;但是手动编辑文本制作一个workflow实在强人所难。 所以本文我们做个webui自动生成workflow。 开搞之前先看看别人怎么做的。 Dify 的ui 效果如下图示&#xff1a; 支持多种功能节点 但只能打开一个节…

【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701

在window上运行spark程序写到本地文件的时候报错。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()错误信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…

如何在电子文件上加盖印章

在电子文件上加盖印章&#xff0c;可以通过多种方法实现&#xff0c;主要包括使用专业软件、在线工具以及图片编辑软件等。以下是一些具体步骤和方法&#xff1a; 一、使用专业软件 PDF编辑工具&#xff1a; 启动常用的PDF编辑软件&#xff0c;如Adobe Acrobat、PhantomPDF等…

红日靶场----(三)漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

阿里云通义千问开源两款语音基座模型分别是SenseVoice和CosyVoice

阿里巴巴近期发布了开源语音大模型项目FunAudioLLM&#xff0c;该项目包含了两个核心模型&#xff1a;SenseVoice和CosyVoice。可以精准多语言识别并且进行语音克隆。 SenseVoice&#xff1a;精准多语言识别与情感辨识 SenseVoice主要致力于高精度多语言语音识别、情感辨识和…