第八届蓝桥杯国赛 发现环

问题描述

  小明的实验室有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

深搜,遇到一个点不是自己的前驱却已经访问过且与当前点相邻,那么就是从这个点到当前点这条链上的点,记录下来排序输出。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;
vector<int> s[100001];
int f[100001] = {-1};
int e[100001];
int n,a,b,flag = 0,c;
void get(int k)
{
    while(k != -1)
    {
        e[c ++] = k;
        k = f[k];
    }
}
void dfs(int k)
{
    for(int i = 0;i < s[k].size();i ++)
    {
        if(flag == -1)return;
        if(f[k] == s[k][i])continue;
        if(f[s[k][i]])
        {
            f[s[k][i]] = -1;
            flag = -1;
            get(k);
            return;
        }
        f[s[k][i]] = k;
        dfs(s[k][i]);
        f[s[k][i]] = 0;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i = 0;i < n;i ++)
    {
        scanf("%d%d",&a,&b);
        s[a].push_back(b);
        s[b].push_back(a);
    }
    dfs(1);
    sort(e,e + c);
    if(e)printf("%d",e[0]);
    for(int i = 1;i < c;i ++)
    {
        printf(" %d",e[i]);
    }
}

原文地址:https://www.cnblogs.com/8023spz/p/9068152.html

时间: 2024-10-10 01:07:17

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

第八届蓝桥杯省赛题解

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

2015蓝桥杯 国赛B组 密文搜索

福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置.要考虑密码的所有排列可能性. 数据格式: 输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024 紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000 紧接着是n行字符串,都是小写字母组成,长度都为8 要求输出: 一个整数, 表示每行密码的所有排列在s

第七届蓝桥杯国赛 一步之遥

题目: 1 一步之遥 2 3 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 4 矿车停在平直的废弃的轨道上. 5 他的面前是两个按钮,分别写着"F"和"B". 6 7 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退. 8 按F,会前进97米.按B会后退127米. 9 透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头. 10 他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助. 11 或许,通过多次操作F和B可以办到. 12 13 矿

第八届蓝桥杯省赛C/C++ A组第8题 包子凑数

参考了http://blog.csdn.net/y1196645376/article/details/69718192 思路: 数论+完全背包. 实现: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int MAXN = 100005; 6 7 int a[105], ok[MAXN], n; 8 9 int gcd(int x, int y) 10 { 11 return !

第八届蓝桥杯省赛 分巧克力

问题描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给小朋友们.切出的巧克力需要满足: 1. 形状是正方形,边长是整数 2. 大小相同 例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力. 当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?输入格式 第一行包含两个整数N和K.(1 <= N, K

2018 蓝桥杯省赛 B 组模拟赛(一)

2018 蓝桥杯省赛 B 组模拟赛(一) A.今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”. 花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”. 请你计算:蒜头君和花椰妹年龄一共有多少种可能情况? 提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内. 题解: 暴力枚举 answer: 1 代码如下: #

蓝桥杯省赛总结

3.28号下午查到了成绩,还行,考到B组省赛一等奖,可以进入决赛. 成绩的结果还是很意外的,因为自己没怎么准备,试题有的题就是瞎写的,只看了官网的两个辅导视频.剩下的懒了 就没看... 面对这电脑,看着题目,才意识到自己的不足之处.以前总是急功近利,想着学几门编程语言,现在才真正明白,语言只是个工具,自己要懂得利用一门编程语言解决实际的问题,并且考虑到优化提高的办法,这样才能提高自己能力,而不是会多少编程语言. 今天记录这些,就是激励自己,以一颗平静的心去学习.在记录,总结,展望中不断地提高自己

第七届蓝桥杯省赛7:剪邮票

第七届蓝桥杯省赛7:剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法. 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 解决思路:先将所有五个一组的情况遍历,然后用广度优先判断是否连通. 我在选五个一组的时候是用的 for 先选出第几个邮票,然后将其

第八届蓝桥杯决赛 发现环

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