第八届蓝桥杯决赛 发现环

标题:发现环
小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。
不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。
为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?



输入

第一行包含一个整数N。
以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连。
对于30%的数据,1 <= N <= 1000
对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N
输入保证合法。



输出

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



样例输入:
5
1 2
3 1
2 4
2 5
5 3



样例输出:
1 2 3 5



资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。


思路

  在输入边的同时,利用并查集判断当前两点是否已经连通,如果已经连通,那么这两点一定在环上,并且这条边也是环上的。那么以这两点分别作为起点和终点,用DFS找到起点到终点的路径,这条路径上的所有点就是环上的所有点!



AC代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 100000+5;
 7 int par[maxn], vis[maxn], ret[maxn];
 8 vector<int> edge[maxn];
 9 int n, s, f;
10
11 int findRoot(int x) {
12     return par[x] == x ? x : par[x] = findRoot(par[x]);
13 }
14
15 void dfs(int u, int ind) {
16     ret[ind] = u;
17     if(u == f) {
18         sort(ret, ret + ind + 1);
19         for(int i = 0; i <= ind; i++) {
20             printf("%d%c", ret[i], i==ind?‘\n‘:‘ ‘);
21         }
22         return;
23     }
24     vis[u] = 1;
25     for(int i = 0; i < edge[u].size(); i++) {
26         int v = edge[u][i];
27         if(!vis[v]) dfs(v, ind+1);
28     }
29     vis[u] = 0;
30 }
31
32 int main() {
33     while(scanf("%d", &n) == 1) {
34         int u, v;
35         for(int i = 1; i <= n; i++) par[i] = i;
36         for(int i = 0; i < n; i++) {
37             scanf("%d%d", &u, &v);
38             int ru = findRoot(u), rv = findRoot(v);
39             if(ru == rv) s = u, f = v;
40             else {
41                 par[ru] = rv;
42                 edge[u].push_back(v);
43                 edge[v].push_back(u);
44             }
45         }
46         memset(vis, 0, sizeof(vis));
47         dfs(s, 0);
48     }
49     return 0;
50 }

如有不当之处欢迎指出!

原文地址:https://www.cnblogs.com/flyawayl/p/8502861.html

时间: 2024-10-29 14:11:08

第八届蓝桥杯决赛 发现环的相关文章

2017第八届蓝桥杯决赛(B组)4.发现环

描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路.环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG. 为了恢复正常传输.小明需要找到所有在环路上的电脑,你能帮助他吗? 输入 第一行包含一个整数N. 以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连. 对

第八届蓝桥杯决赛 磁砖样式

标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格.现在手头有一批刚好能盖住2个小方格的长方形瓷砖.瓷砖只有两种颜色:黄色和橙色.小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来.小明有个小小的强迫症:忍受不了任何2*2的小格子是同一种颜色.(瓷砖不能切割,不能重叠,也不能只铺一部分.另外,只考虑组合图案,请忽略瓷砖的拼缝)显然,对于 2*3 个小格子来说,口算都可以知道:一共10种贴法,如[p1.png所示]但对于 3*10 的格子呢?肯定是个不小的数目,请你利用计算机的威

第八届蓝桥杯省赛题解

一直以来,自己的科技类竞赛实在太少了,确实是自己的问题,从大学没有对自己有一个明确的规划,现在再回过头去恶补很多的知识点.悔当初,甚至怀疑自己,却已经来不及,最近因为某些人某些事让自己心情变得十分差,把自己弄得狼狈不堪. 今年是第一次参加蓝桥杯比赛,原本寒假就打算好好复习的,一直没有静下心来准备,正式做题是在比赛前3天.校区是在绵阳师范墨家小区,还以为头一天就要赶过去,后面接到学院老师的电话说一起跟着大部队过去,于是就在早上6点起来,看了会算法,吃早餐后就随着校车去了. 这次去参赛的都是比较厉害

2015蓝桥杯决赛

五月二十八号,坐上了开往北京的火车.第一次到北京参加全国性的比赛,第六届蓝桥杯决赛,心里面还是很兴奋的,同时也有一点点紧张,还是希望自己能拿一个比较好的成绩.提前一天到,大家看了看考场,比赛地点在北大计算中心,30号下午一点开始了正式的比赛,比赛时间四个小时. 比赛题目类型和初赛差不多,有结果填空,代码填空和程序设计三种类型.但是题量少很多,一共只有六道,分别是两道结果填空,一道代码填空,三道编程大题.我参加的是C++本科A组,比赛结束了,凭印象还是先把题目总结一下. A.结果填空 题目大意:有

2016年 蓝桥杯决赛体验

本来想搜决赛题解的... 结果搜到了“如何评价16年蓝桥杯......”看到一众人说自己只会第一题....刚觉得安慰了许多... 然后就搜到了决赛成绩...优秀奖...完美打铁... .........看到同行的一等...二等...三等...怀疑自己的水平已经..... 说多了都是泪....已经不能理解只提交了第一题我了... 比赛的时候就感觉不想写不想写...看上去都是可以暴力过30%~50%的数据...然后暴力每每写的太丑...放弃找bug...填空题又太笨没有想出来... 就这样思考完了每

第八届蓝桥杯国赛 发现环

问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路.环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG. 为了恢复正常传输.小明需要找到所有在环路上的电脑,你能帮助他吗? 输入格式 第一行包含一个整数N. 以下N行每行两个整数a和b,表示a和b之间有一条数据链接相

第八届蓝桥杯 承压计算 (代码+详解)

承压计算 标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同. 金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 8 8 4 1 7 9 6 1 4 5 4 5 6 5 5 6 9 5 6 5 5 4 7 9 3 5 5 1 7 5 7 9 7 4 7 3 3 1 4 6 4 5 5 8 8 3 2 4 3 1 1 3 3 1 6 6 5 5 4 4 2 9 9 9 2 1 9 1

2017第八届蓝桥杯C/C++ B组省赛个人代码

第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的. 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定. 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物. 取款机只能提供100元面额的纸币.小明想尽可能少取些现金,够用就行了. 你的任务是计算出,小明最少需要取多少现金. 以下是让人头疼的购物单,为了保

2017第八届蓝桥杯C/C++ B组省赛-日期问题

标题:日期问题 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的.更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应. 比如02/03/04,可能是2002年03月04日.2004年02月03日或2004年03月02日. 给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?