【深基18.例3】查找文献(C++,图的遍历)

news2025/1/9 16:39:20

题目描述

小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。

假设洛谷博客里面一共有 n ( n ≤ 1 0 5 ) n(n\le10^5) n(n105) 篇文章(编号为 1 到 n n n)以及 m ( m ≤ 1 0 6 ) m(m\le10^6) m(m106) 条参考文献引用关系。目前小 K 已经打开了编号为 1 的一篇文章,请帮助小 K 设计一种方法,使小 K 可以不重复、不遗漏的看完所有他能看到的文章。

这边是已经整理好的参考文献关系图,其中,文献 X → Y 表示文章 X 有参考文献 Y。不保证编号为 1 的文章没有被其他文章引用。

请对这个图分别进行 DFS 和 BFS,并输出遍历结果。如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。

输入格式

m + 1 m+1 m+1 行,第 1 行为 2 个数, n n n m m m,分别表示一共有 n ( n ≤ 1 0 5 ) n(n\le10^5) n(n105) 篇文章(编号为 1 到 n n n)以及 m ( m ≤ 1 0 6 ) m(m\le10^6) m(m106) 条参考文献引用关系。

接下来 m m m 行,每行有两个整数 X , Y X,Y X,Y 表示文章 X 有参考文献 Y。

输出格式

共 2 行。
第一行为 DFS 遍历结果,第二行为 BFS 遍历结果。

样例 #1

样例输入 #1

8 9
1 2
1 3
1 4
2 5
2 6
3 7
4 7
4 8
7 8

样例输出 #1

1 2 5 6 3 7 8 4 
1 2 3 4 5 6 7 8

解题思路:

由于需要优先到达编号小的节点,所以采用优先队列,用vector存图

深度优先搜索思路如下

void dfs(int index) {//index为当前位置
	while (!queue[index].empty()) {
		if (/* 已经来过 */) queue[index].pop(); 
        else dfs(index);
    }
}

广度优先搜索思路如下

void bfs(int index) {//index为起始位置
	while (/* bfs队列不为空 */) {
		while (!queue[/* bfs首元素 */].empty()) {
			if (/* 已经来过 */) queue.pop();
			else /* queue.top()插入bfs队列 */;
		}
		/* bfs队首出队 */;
	}
}

实现代码如下

#include <iostream>
#include <memory.h>
#include <queue>
using namespace std;
const int max_n = 1e5;
const int max_m = 1e6;

priority_queue<int, vector<int>, greater<int>>edges[max_n + 1];
priority_queue<int, vector<int>, greater<int>>edges_bfs[max_n + 1];
queue<int>bfs_queue;
bool book[max_n + 1] = { false };

void dfs(int index) {
	while (!edges[index].empty()) {
		if (book[edges[index].top()]) {
			edges[index].pop();
			continue;
		}
		int temp = edges[index].top();
		edges[index].pop();
		book[temp] = true;
		cout << temp << ' '; dfs(temp);
	}
}

void bfs(int index) {
	cout << index << ' ';
	bfs_queue.push(index);
	book[index] = true;
	while (!bfs_queue.empty()) {
		int head = bfs_queue.front();
		while (!edges_bfs[head].empty()) {
			if (book[edges_bfs[head].top()]) {
				edges_bfs[head].pop();
				continue;
			}
			int temp = edges_bfs[head].top();
			edges_bfs[head].pop();
			cout << temp << ' ';
			bfs_queue.push(temp);
			book[temp] = true;
		}
		bfs_queue.pop();
	}
}

int main() {
	int n, m, u, v;
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		cin >> u >> v;
		edges[u].push(v);
		edges_bfs[u].push(v);
	}
	book[1] = true;
	cout << 1 << ' '; dfs(1); cout << endl;
	memset(book, false, sizeof(bool) * (max_n + 1));
	bfs(1);
	return 0;
}

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

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

相关文章

JavaScript 中如何代理 Set(集合) 和 Map(映射)

ECMAScript6 中 Set 和 Map 的代理方法上一节&#xff1a;《JavaScript 中如何代理数组 》| 下一节&#xff1a;《JavaScript 中的反射&#xff08;Reflect&#xff09;原理与应用 》今日正在编写中&#xff0c;未完待续… jcLee95 邮箱 &#xff1a;291148484163.com CSDN…

Git分支操作

实操记录 假定非管理人员操作&#xff1a; 直推&#xff1a; 新建特性分支cbry&#xff1a; 刷新分支&#xff1a; checkout切换&#xff1a; 本地文件查看&#xff1a; 再merge&#xff1a; 就此&#xff0c;master的代码就合并到特性分支cbry&#xff1a; 新增内容&#xff…

数字化技术转型

这篇老生常谈&#xff08;我写过N次&#xff09;&#xff0c;是应一位IM群中的朋友的困惑问答汇集而成的。&#xff08;1&#xff09;学科分类我上学学的是计算机系。我上的大学一开始并没有计算机系&#xff0c;后来是电子工程系和数学系的老师抽调组成了计算机系。后来&#…

申请大学用的是IB预估分?

IB课程体系以其独特的优越性成为越来越多国际高中生的选择。如今全球共有3300多所高校接受IB成绩申请&#xff0c;其中包括美国常春藤盟校、英国G5在内的多所名校。 但是&#xff0c;大家知道吗&#xff0c;国内学习IB课程的学生是需要用预估分来申请大学的。今天&#xff0c;小…

多用户及时通信系统

目录1. QQ用户登录1.1 用户登录11.2 用户登录21.3 用户登录32. 拉取在线用户3. 无异常退出4. 私聊系统5. 群聊3. 发送文件3.1 服务端推送新闻3.2 离线留言和离线发文件1. QQ用户登录 1.1 用户登录1 qqcommon包下 User类序列化 Message消息类序列化 MessType接口 qqclient.ut…

拉伯杠杆平台|沪指上涨,大金融板块领涨,有股票连续5涨停!

A股周二上午全体小幅上涨&#xff0c;大金融集体上涨&#xff0c;推动指数上行&#xff0c;商场全体动摇不大。A50期货高开高走&#xff0c;盘中暴拉超2.6%。 不过&#xff0c;部分个股仍然动摇不小&#xff0c;有多只股票接连涨停。 别的&#xff0c;新股持续分解&#xff0c…

ATAC-seq分析:数据介绍(2)

1. 简介 ATACseq (Assay for Transposase-Accessible Chromatin using sequencing) 使用转座酶在测序前有效地片段化可访问的 DNA&#xff08;DNA可极性&#xff09;。结果提供了一种绘制可访问/开放染色质基因组范围的方法。 与其他技术相比&#xff0c;ATACseq 有几个优点&am…

嵌入式开发学习之--串口通讯(下)

提示&#xff1a;本篇来做一个关于串口的输入输出实验。 文章目录前言一、项目概况1.1、项目需求1.2、项目来源1.3、开发环境1.4、项目意义1.5、项目效果展示二、开发步骤2.1、涉及硬件电路2.2、项目代码2.2.1、串口配置总结前言 前一篇文章我们介绍了串口的几种类型以及串口标…

Linux Shell 编程,运算符,条件与分支,循环

Linux Shell 编程&#xff0c;运算符&#xff0c;条件与分支&#xff0c;循环1.Shell运算符2.判断语句3.for循环4.while循环1.Shell运算符 学习如何在shell中进行各种运算操作 案例&#xff1a;计算&#xff08;57&#xff09;3的值&#xff1a; #!/bin/bash res$(((57)*3)) …

游戏物体GameObject

在unity中所有游戏物体都是GameObject&#xff0c;这也是编程中的对象。 创建物体 在hierarchy窗口中&#xff0c;右击可以创建一个物体&#xff0c;当然也可以创建空物体。 物体属性 创建完物体后&#xff0c;一般可以在此处用这些工具来改变物体。 移动&#xff0c;旋转和…

戴尔科技集团助力中国石油大学打造现代数据中心

小的时候      总是幻想着      能够躺在床上上课      没想到现在竟然实现了      没错,对于当代大学生尤其是19级、20级来说,大学生活似乎是个虚无缥缈的词汇,因为相比与在校生活,在家上网课的时间可能会更长,一不留神就上了三年的“家里蹲”。      即使…

安装配置高度安全的匿名操作系统,利用暗网情报数据抓取工具获取普通人根本查看不到的信息

安装配置高度安全的匿名操作系统,利用暗网情报数据抓取工具获取普通人根本查看不到的信息。 Whonix匿名操作系统,Whonix 是一个专注于匿名,隐私和安全的操作系统。它基于Tor匿名网络,Debian GNU / Linux和隔离安全性。DNS泄漏是不可能的,即使具有root权限的恶意软件也无法…

“多点”开花,独立走向新零售

12月7日&#xff0c;亚洲最大的数字零售服务商多点Dmall正式向港交所递交招股说明书&#xff0c;在零售行业逐渐向线上线下一体化、店仓一体模式迈进之时&#xff0c;多点Dmall成为很多传统零售商转型路上的首选合作伙伴&#xff0c;给予了资本市场一定想象空间。 但也有观点认…

【Lua】ToLua逻辑热更新

1 前言 Lua基础语法 中系统介绍了 Lua 的语法体系&#xff0c;本文将进一步介绍 Unity3D 中基于 ToLua 实现逻辑热更新。 逻辑热更新是指&#xff1a;在保持程序正常运行的情况下&#xff0c;在后台修改代码逻辑&#xff0c;修改完成并推送到运行主机上&#xff0c;主机无缝接入…

HarmonyOS原子化服务最新概念、呈现形式与触发方式

一、HarmonyOS原子化服务最新概念 总体介绍&#xff1a; 原子化服务&#xff08;Ability&#xff09;是由HarmonyOS服务开放平台接入的一种技能&#xff0c;为华为智慧服务、智慧搜索、服务直达、智慧语音以及智慧视觉等流量入口提供服务技能。原子化服务以轻量化的呈现形式&…

高级网络应用复习——TCP与UDP,ACL列表, 防火墙,NAT复习与实验(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.知识点总结 1.传输层的协议 &#xff08;1&#xff09;TCP 和…

「实操」结合图数据库、图算法、机器学习、GNN 实现一个推荐系统

本文是一个基于 NebulaGraph 上图算法、图数据库、机器学习、GNN 的推荐系统方法综述&#xff0c;大部分介绍的方法提供了 Playground 供大家学习。 基本概念 推荐系统诞生的初衷是解决互联网时代才面临的信息量过载问题&#xff0c;从最初的 Amazon 图书推荐、商品推荐&…

TCP的三次握手四次挥手详解

想要了解TCP的三次握手和四次挥手&#xff0c;首先要了解TCP的头部结构 TCP的头部结构如下 16位源端口号&#xff1a; 客户端地址信息16位目标端口号&#xff1a; 服务端地址信息32位序列号&#xff1a; 请求报文端数据流子节开始的位置&#xff08;比如位1024&#xff5e;2…

【20天快速掌握Python】day15-网络编程

1.网络通信的概念 简单来说&#xff0c;网络是用物理链路将各个孤立的工作站或主机相连在一起&#xff0c;组成数据链路&#xff0c;从而达到资源共享和通信的目的。 使用网络的目的&#xff0c;就是为了联通多方然后进行通信&#xff0c;即把数据从一方传递给另外一方。 前…

以分页场景谈MVC设计模式

一 、需求场景 需要实现一个分页组件&#xff0c; 可以方便的进行分页操作。 二、分析需求 从分页需求出发&#xff0c;分析潜在的元素&#xff0c; 虽然只包含一个大的分页功能&#xff0c;但是潜在的元素 包含&#xff1a;上一页 下一页 首页 尾页 当前页 等等。 为什么包含…