hnust 1965: 深度优先搜索

hnust 1965: 深度优先搜索

题目描述
输入一个图,用邻接矩阵存储(实际上也可以选择邻接表),并实现DFSTraverse操作。
拷贝前面已经实现的代码,主函数必须如下,完成剩下的部分。

int main()
{
Graph g;
CreateUDG(g);
DFSTraverse(g);
cout << endl;
DestroyUDG(g);
return 0;
}//main

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

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

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

具体见样例。

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

具体见样例。

样例输入 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 v4 v8 v5 v3 v6 v7
提示
样例对应教材6.5的图G4

解题过程

注:本题按照书上算法解析完成,深度优先搜索的细化代码及函数分解请看合集《2024.6 hnust 23级 数据结构 课程设计》“推箱子游戏-深度优先搜索版本”
图的深度优先遍历(DFS)需要借助栈来遍历:
①首先,选取图中某一顶点vi作为起始点访问;
②任意选取一个与vi邻接的顶点,且该顶点未被访问,一直重复下去,直到图中所有与vi连通的顶点都被访问到;【可概括为由起始顶点开始,沿着一条路径尽可能地深入搜索该图,直到无法再继续下去】
③若还有顶点未被访问到,则另外选取一个未被访问的顶点再次作为起始点,回溯到上一个未访问的顶点,重复以上步骤,直至图中所有结点被访问。

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

2、DFS算法的时间复杂度
时间复杂度取决于图的存储结构,若通过邻接矩阵表示图,则查找顶点的邻接顶点所需时间为O(|V|),总时间复杂度为O(|V2|)(邻接矩阵为方阵n×n);若通过邻接表表示图,则查找所有顶点的邻接顶点所需时间为O(|E|),访问顶点所需时间为O(|V|),即总时间复杂度为O(|V|+|E|)。

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

  1. 头文件和命名空间

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

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

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

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

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

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

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

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

    • 使用 stack 来实现DFS,首先将起始顶点压入栈中,并标记为已访问。
  10. DFS搜索

    • 当栈不为空时,执行循环:
      • 弹出栈顶元素作为当前访问的顶点。
      • 遍历当前顶点的所有邻接顶点。
      • 如果邻接顶点未被访问,将其标记为已访问,并压入栈中。
      • 如果成功访问了一个邻接顶点,输出当前顶点名称,并设置 flag 为 1。
      • 如果没有邻接顶点可访问(flag 为 0),则继续弹出栈中的元素。
  11. 输出访问顺序

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

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

代码逻辑分析

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

潜在问题

  • 代码中注释掉的部分提供了另一种交换变量值的方法,但在当前实现中未使用。
  • 代码中使用 9999 作为邻接矩阵的初始值,这可能在某些情况下不是最佳选择,比如图中边的权重可能超过这个值。

改进建议

  • 考虑使用 std::vector 替代数组,以提高代码的安全性和灵活性。
  • 考虑使用 std::unordered_map 替代 std::map,以提高查找效率。
  • 考虑使用 std::swap 函数交换变量值,使代码更加简洁。
  • 如果需要处理更大的图或更复杂的图结构,可以考虑优化内存使用和搜索算法。

AC代码

#include<bits/stdc++.h>
using namespace std;int main(int argc, char const *argv[])
{int n , e;cin >> n >> e;  // 输入 : 8 9string nodes[n];for (int i = 0; i < n; ++i)  // 输入: v1 v2 v3 v4 v5 v6 v7 v8{cin >> nodes[i];}map <string , int > location;for (int i = 0; i < n; ++i)   //排序数组{location[nodes[i]] = i;}map<string ,std::vector<string> > G;  //创建无向图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]]){swap(G[nodes[i]][q],G[nodes[i]][p]);}}}}map<string,bool > vis; //是否被访问stack <string > s;s.push(nodes[0]);vis[nodes[0]] = true;cout << nodes[0] << " " ;while(s.size()){string curr;curr = s.top();bool flag = 0;for(auto next : G[curr]){if(!vis[next]){vis[next] = true;s.push(next);flag = 1;cout << next << " ";break;}}if(flag == 0){s.pop();}}return 0;
}

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

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

相关文章

RTOS系统 -- 调试大法之FreeRTOS在M4上实现coredump功能

FreeRTOS内核崩溃&#xff08;coredump&#xff09;及异常打印技术 技术背景 在嵌入式系统中&#xff0c;FreeRTOS是一款广泛使用的实时操作系统。FreeRTOS本身并不包含默认的coredump机制&#xff0c;但我们可以通过自定义异常处理函数来实现异常打印和coredump功能。通过捕…

了解PPO算法(Proximal Policy Optimization)

Proximal Policy Optimization (PPO) 是一种强化学习算法&#xff0c;由 OpenAI 提出&#xff0c;旨在解决传统策略梯度方法中策略更新过大的问题。PPO 通过引入限制策略更新范围的机制&#xff0c;在保证收敛性的同时提高了算法的稳定性和效率。 PPO算法原理 PPO 算法的核心…

Oracle数据库自带的内置表和视图、常用内部视图

文章目录 一.Oracle数据库自带的内置表和视图1.dba_开头表2.user_开头表3.v$开头表4.all_开头表5.session_开头表6.index_开头表 三.按组分的几组重要的性能视图1.System的over view2.某个session的当前情况3.SQL的情况4.Latch/lock/ENQUEUE5.IO方面的 分类类别关系群集、表、视…

【docker 把系统盘空间耗没了!】windows11 更改 ubuntu 子系统存储位置

系统&#xff1a;win11 ubuntu 22 子系统&#xff0c;docker 出现问题&#xff1a;系统盘突然没空间了&#xff0c;一片红 经过排查&#xff0c;发现 AppData\Local\packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\ 这个文件夹竟然有 90GB 下面提供解决办法 步…

Spring-AOP(二)

作者&#xff1a;月下山川 公众号&#xff1a;月下山川 1、什么是AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程的一种补充和完善&#xff0c;它以通过预编译方式和运行期…

【课程总结】Day13(下):人脸识别和MTCNN模型

前言 在上一章课程【课程总结】Day13(上):使用YOLO进行目标检测,我们了解到目标检测有两种策略,一种是以YOLO为代表的策略:特征提取→切片→分类回归;另外一种是以MTCNN为代表的策略:先图像切片→特征提取→分类和回归。因此,本章内容将深入了解MTCNN模型,包括:MTC…

CountDownLatch 是 Java 中的一个同步辅助工具类

下面是一个使用 CountDownLatch 的案例分析&#xff0c;我们将通过一个简单的示例来展示如何使用 CountDownLatch 来同步多个线程的操作。 ### 场景描述 假设我们有一个任务&#xff0c;需要从多个数据源&#xff08;比如多个数据库表或文件&#xff09;中读取数据&#xff0c…

使用jdk11运行javafx程序和jdk11打包jre包含javafx模块

我们都知道jdk11是移除了javafx的,如果需要使用javafx,需要单独下载。 这就导致我们使用javafx开发的桌面程序使用jdk11时提示缺少javafx依赖。但这是可以通过下面的方法解决。 一,使用jdk11运行javafx程序 我们可以通过设置vmOptions来使用jdk11运行javafx程序 1,添加j…

【RAG KG】GraphRAG开源:查询聚焦摘要的图RAG方法

前言 传统的 RAG 方法在处理针对整个文本语料库的全局性问题时存在不足&#xff0c;例如查询&#xff1a;“数据中的前 5 个主题是什么&#xff1f;” 对于此类问题&#xff0c;是因为这类问题本质上是查询聚焦的摘要&#xff08;Query-Focused Summarization, QFS&#xff09…

嵌入式单片机,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;使用单片机是嵌入式系统的…

iOS 国际化语言第一语言不支持时候默认语言强转英文

对bundle扩展 直接贴代码 .h文件 // // NSBundleKdLocalBundle.h // QooCam // // Created by bob bob on 2023/9/8.//#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGINinterface NSBundle (KdLocalBundle)end interface KdLocalBundle:NSBundleend interf…

CurrentHashMap巧妙利用位运算获取数组指定下标元素

先来了解一下数组对象在堆中的存储形式【数组长度&#xff0c;数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…

软件工程常见知识点

下午收到字节日常实习的面试邀请&#xff0c;希望这次能有一个好的表现。言归正传&#xff0c;邮件中提到这些问题&#xff0c;我这边借了书并查了网上的资料&#xff0c;做一个提前准备。 软件工程核心概念&#xff1a; 如何从一个需求落实到一个系统设计&#xff1f; 经过我…

c++ primer plus 第15章友,异常和其他:异常,15.3.7 其他异常特性

c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.7 其他异常特性 c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.7 其他异常特性 文章目录 c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.7 其他异常特性 15.…

Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型 文章目录 Sorted Set 类型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

android Dialog全屏沉浸式状态栏实现

在Android中&#xff0c;创建沉浸式状态栏通常意味着让状态栏背景与应用的主题颜色一致&#xff0c;并且让对话框在状态栏下面显示&#xff0c;而不是浮动。为了实现这一点&#xff0c;你可以使用以下代码片段&#xff1a; 1、实际效果图&#xff1a; 2、代码实现&#xff1a;…

揭秘GPT-4o:未来智能的曙光

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;的发展突飞猛进&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域的进步&#xff0c;更是引人注目。在这一背景下&#xff0c;OpenAI发布的GPT系列模型成为了焦点。本文将详细探讨最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿赵。 上一篇的结束时&#xff0c;海面效果已经做成这样了&#xff1a; 这个Shader的复杂程度已经比较高了&#xff1a; 不过还有一些美中不足的地方。 1、 海平面没有反射到天空球 2、 在近岸边看得到水底的部分&#xff0c;水…

JVM调优:深入理解与实战指南

引言 Java虚拟机&#xff08;JVM&#xff09;作为Java应用程序的运行环境&#xff0c;其性能直接影响到应用程序的响应速度、吞吐量和稳定性。JVM调优是Java开发者必须掌握的一项关键技能&#xff0c;它能够帮助我们更好地利用系统资源&#xff0c;提升应用程序的性能。本文将…