【洛谷 P8655】[蓝桥杯 2017 国 B] 发现环 题解(邻接表+并查集+路径压缩)

[蓝桥杯 2017 国 B] 发现环

题目描述

小明的实验室有 N N N 台电脑,编号 1 ∼ N 1 \sim N 1N。原本这 N N N 台电脑之间有 N − 1 N-1 N1 条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。

不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了 BUG。

为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?

输入格式

第一行包含一个整数 N N N

以下 N N N 行每行两个整数 a a a b b b,表示 a a a b b b 之间有一条数据链接相连。

输入保证合法。

输出格式

按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。

样例 #1

样例输入 #1

5
1 2
3 1
2 4
2 5
5 3

样例输出 #1

1 2 3 5

提示

对于 30 % 30\% 30% 的数据, 1 ≤ N ≤ 1000 1 \le N \le 1000 1N1000

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1N105 1 ≤ a , b ≤ N 1 \le a,b \le N 1a,bN

时限 1 秒, 256M。蓝桥杯 2017 年第八届国赛


思路

首先,从输入中读取电脑的数量 N N N。接着,进行并查集的初始化,使得每个电脑都是其自身的根节点,这是通过 init() 函数实现的。

然后进入一个循环,循环次数为电脑的数量,即 N N N 次。在每次循环中,分别读取两个电脑的编号 u u u v v v。这两个编号表示电脑 u u u v v v 之间有一条数据链接。

对于每一对电脑 u u u v v v,首先检查它们是否在同一个集合中。这是通过 check(u, v) 实现的,如果它们的根节点相同,返回 1;否则,返回 0

如果 check(u, v) 返回 0,说明电脑 u u u v v v 之间还没有路径,可以添加一条连接。此时,通过 merge(u, v) 将它们合并到同一个集合中,这是通过找到它们的根节点,然后将一个的根节点的父节点设置为另一个的根节点实现的。同时,通过 add(u, v) 在图中添加一条连接,这是通过在邻接表中分别为 u u u v v v 添加对方的编号实现的。

如果 check(u, v) 返回 1,说明电脑 u u u v v v 已经通过其他路径连接,再添加一条连接就会形成环。此时,需要找出环中的所有电脑。首先,重置 bitset<N> vis,这是一个位集,用于标记电脑是否被访问过。然后,设置环的目标节点 dest = v,这是因为电脑 v v v 是形成环的那一条边的一个节点。最后,从电脑 u u u 开始进行深度优先搜索(DFS),找出所有在环中的电脑。这是通过 dfs(u, 0) 实现的,其中 0 是电脑 u u u 的父节点编号,因为 u u u 是DFS的起点,所以其父节点编号为 0

在深度优先搜索的过程中,首先标记当前电脑已被访问,这是通过 vis[x] = 1 实现的。然后,检查当前电脑是否是环的目标电脑,如果是,打印出所有已被访问的电脑(也就是环中的电脑),然后返回。如果不是,对当前电脑的所有邻居进行深度优先搜索,这是通过递归调用 dfs(i, x) 实现的,其中 i 是邻居的编号,x 是当前电脑的编号。最后,在DFS返回前,将当前电脑标记为未被访问,这是通过 vis[x] = 0 实现的。


AC代码

#include <algorithm>
#include <bitset>
#include <cmath>
#include <iostream>
#include <stack>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;int n;
int pre[N];
vector<int> g[N];
stack<int> stk;
bitset<N> vis;
int dest;int root(int a) {int i = a;while (i != pre[i]) {i = pre[i];}return (pre[a] = i);
}void merge(int a, int b) {int ra, rb;ra = root(a);rb = root(b);if (ra == rb) {return;}pre[ra] = rb;
}bool check(int a, int b) {int ra, rb;ra = root(a);rb = root(b);if (ra == rb) {return 1;}return 0;
}void add(int u, int v) {g[u].push_back(v);g[v].push_back(u);
}void init() {for (int i = 1; i <= n; i++) {pre[i] = i;}
}void dfs(int x, int fa) {// cout << x << endl;vis[x] = 1;if (x == dest) {for (int i = 1; i <= n; i++) {if (vis[i]) {cout << i << " ";}}cout << "\n";return;}for (const auto i : g[x]) {if (i == fa) {continue;}dfs(i, x);}vis[x] = 0;
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;init();for (int i = 1; i <= n; i++) {int u, v;cin >> u >> v;if (check(u, v)) {vis.reset();dest = v;dfs(u, 0);} else {merge(u, v);add(u, v);}}return 0;
}

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

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

相关文章

ARM架构学习笔记2-汇编

RISC是精简指令集计算机&#xff08;RISC:Reduced Instruction Set Computing&#xff09; ARM汇编概述 一开始&#xff0c;ARM公司发布两类指令集&#xff1a; ① ARM指令集&#xff0c;这是32位的&#xff0c;每条指令占据32位&#xff0c;高效&#xff0c;但是太占空间 2…

怎么让html打开网页自动跳转(多个链接)?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

#SOP#-如何使用AI辅助论文创作

#SOP#-如何使用AI辅助论文创作 ——2024.4.6 “在使用工具的时候&#xff0c;要做工具的主人” 最终交付物&#xff1a; 一份可执行的AI辅助创作论文的指导手册 交付物质量要求&#xff1a; 不为任何AI大模型付费&#xff01;不为任何降重网站付费&#xff01;通过知网检查论…

语义分割——自动驾驶鱼眼数据集

一、重要性及意义 环境感知&#xff1a;语义分割技术能够精确识别道路、车辆、行人、障碍物、交通标志和信号等各种交通场景元素。这为自动驾驶系统提供了丰富的环境信息&#xff0c;有助于车辆准确理解周围环境的结构和动态变化。决策规划&#xff1a;基于语义分割的结果&…

2024 最新版 Proteus 8.17 安装汉化教程

前言 大家好&#xff0c;我是梁国庆。 今天给大家带来的是目前 Proteus 的最新版本——Proteus 8.17。 时间&#xff1a;2024年4月4日 获取 Proteus 安装包 我已将本篇所使用的安装包打包上传至百度云&#xff0c;扫描下方二维码关注「main工作室」&#xff0c;后台回复【…

(2024,手部生成,SMPL,MANO,SD,手部参数)HanDiffuser:具有逼真手部外观的文本到图像生成

HanDiffuser: Text-to-Image Generation With Realistic Hand Appearances 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. HanDiffuser 3.1. 基础 3.2. Tex…

webrtcP2P通话流程

文章目录 webrtcP2P通话流程webrtc多对多 mesh方案webrtc多对多 mcu方案webrtc多对多 sfu方案webrtc案例测试getUserMediagetUserMedia基础示例-打开摄像头getUserMedia canvas - 截图 打开共享屏幕 webrtcP2P通话流程 在这里&#xff0c;stun服务器包括stun服务和turn转发服…

docker进行jenkins接口自动化测试持续集成实战

文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk&#xff0c;maven&#xff0c;git&#xff0c;allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…

I2C驱动实验:验证所添加的I2C设备的设备节点

一. 简介 前面一篇文章向设备树中的 I2C1控制器节点下&#xff0c;添加了AP3216C设备节点。文章如下&#xff1a; I2C驱动实验&#xff1a;向设备树添加 I2C设备的设备节点信息-CSDN博客 本文对设备树进行测试&#xff0c;确认设备节点是否成功创建好。 二. I2C驱动实验&a…

算法刷题应用知识补充--基础算法、数据结构篇

这里写目录标题 位运算&#xff08;均是拷贝运算&#xff0c;不会影响原数据&#xff0c;这点要注意&#xff09;&、|、^位运算特性细节知识补充对于n-1的理解异或来实现数字交换找到只出现一次的数据&#xff0c;其余数据出现偶数次 >> 、<<二进制中相邻的位的…

动态多目标优化:动态约束多目标优化测试集DCP1-DCP9的TruePF(提供MATLAB代码)

一、进化动态约束多目标优化测试集DCP1-DCP9 参考文献&#xff1a; [1]G. Chen, Y. Guo, Y. Wang, J. Liang, D. Gong and S. Yang, “Evolutionary Dynamic Constrained Multiobjective Optimization: Test Suite and Algorithm,” in IEEE Transactions on Evolutionary Com…

Web3:数字化社会的下一步

随着技术的不断进步和互联网的发展&#xff0c;我们正逐渐迈入一个全新的数字化社会阶段。在这个新的时代&#xff0c;Web3作为数字化社会的重要组成部分&#xff0c;将发挥着举足轻重的作用。本文将探讨Web3在数字化社会中的意义、特点以及对未来发展的影响。 1. 重新定义数字…

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法&#xff0c;本以为基于深度学习的方法会使用对比损失之类的函数进行训练&#xff0c;但是Arcface算法基于softmax进行了创新&#xff0c;本文未深究其详细的loss公式原理&#xff0c;在大致明白其方向下&#xff0c;运行了代码&#xff0c;…

06-kafka及异步通知文章上下架

kafka及异步通知文章上下架 1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高&#xff08;主从&#xff09;高&#xff08;主从&#…

spring中各种bean加载顺序

具体加载顺序按照罗列的顺序 XXXAware ApplicationContextAware、EnvironmentAware、BeanFactoryAware、BeanClassLoaderAware 顾名思义&#xff0c;用于获取对应的对象&#xff0c;需要在实体类中声明对应的对象且当前类为普通类能被注入。 InitializingBean void afterProp…

下载页面上的视频

引言&#xff1a;有些页面上的视频可以直接右键另存为或者F12检索元素找到视频地址打开后保存&#xff0c;但有些视频页面是转码后的视频&#xff0c;不能直接另存为视频格式&#xff0c;可以参考下本方法 以该页面视频为例&#xff1a;加载中...点击查看详情https://wx.vzan.c…

WindowsPowerShell安装配置Vim的折腾记录

说明 vim一直以来都被称为编辑器之神一样的存在。但用不用vim完全取决于你自己&#xff0c;但是作为一个学计算机的同学来说&#xff0c;免不了会和Linux打交道&#xff0c;而大部分的Linux操作系统都预装了vim作为编辑器&#xff0c;如果是简单的任务&#xff0c;其实vim只要会…

Java_自定义实体类的列表List<T>调用remove()失败讲解

示例1 前提&#xff1a; 新建一个主类Demo1。 需求&#xff1a; 在一个列表中有三条String的数据&#xff0c;想要使用remove(Object o)删掉其中一条。 结果&#xff1a; remove(Object o)成功把数据删掉。 示例2 前提&#xff1a; 新建一个自定义实体类DataExample和一个主…

爬取学习强国视频小示例

因为需要爬取的视频数量并不是很大&#xff0c;总共需要将131个视频下载下来&#xff0c;所以就直接去手动找找视频的地址和名称保存下来的。由于页面是动态加载的&#xff0c;所以我们无法在网站源码中直接找到视频的超链接。设想是可以用Selenium模拟浏览器点击进行动态加载获…

uni-app如何实现高性能

这篇文章主要讲解uni-app如何实现高性能的问题&#xff1f; 什么是uni-app&#xff1f; 简单说一下什么是uni-app&#xff0c;uni-app是继承自vue.js&#xff0c;对vue做了轻度定制&#xff0c;并且实现了完整的组件化开发&#xff0c;并且支持多端发布的一种架构&#xff0c…