描述

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

思路

DFS搜索,直到找到一条可以返回起点的路径为止。

由于是无向图,需要注意一下 如果所有点都遍历了还是没找到那就直接返回,即:

    if (walk.size() == n) {
return;
}

而且如果发现环那么那个环上每个点出发都会输出一次,而题目只要求输出一次,所以还要保存一下当前找到的环,对应代码:

if (std::find(found.begin(), found.end(), walk) == found.end()) {
found.push_back(walk);
for (int i = 0; i < walk.size(); i++) {
std::cout << walk[i] << " ";
}
std::cout << "\n";
}
return;

然后就是日常的DFS遍历了。

源码

#include <iostream>
#include <map>
#include <algorithm>
#include <vector> int n = 0;
std::vector<std::vector<int>> found; std::multimap<int, int> edge;
void dfs(std::vector<int> walk, int start, int current) {
if (start == current) {
std::sort(walk.begin(), walk.end());
if (std::find(found.begin(), found.end(), walk) == found.end()) {
found.push_back(walk);
for (int i = 0; i < walk.size(); i++) {
std::cout << walk[i] << " ";
}
std::cout << "\n";
}
return;
}
if (walk.size() == n) {
return;
} auto begin = edge.lower_bound(current);
auto end = edge.upper_bound(current);
while (begin != end) {
int node = begin->second;
if (walk[walk.size() - 1] != node) {
// If we haven't visited this node
walk.push_back(current);
dfs(walk, start, node);
walk.pop_back();
}
++begin;
}
} int main() {
std::cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
std::cin >> a >> b;
edge.insert({ a,b });
edge.insert({ b,a });
}
for (auto b = edge.begin(); b != edge.end(); ++b) {
std::vector<int> walk;
walk.push_back(b->first);
dfs(walk, b->first, b->second);
}
return 0;
}

2017第八届蓝桥杯决赛(C++ B组)4.发现环的更多相关文章

  1. 2017第八届蓝桥杯决赛(C++ B组)2.磁砖样式

    磁砖样式 小明家的一面装饰墙原来是 310 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来. ...

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

    标题:日期问题 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的 ...

  3. 2017第八届蓝桥杯C/C++ B组省赛-购物单

    标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折 ...

  4. 2017第八届蓝桥杯C/C++ B组省赛-等差素数列

    标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 200 ...

  5. 2017第八届蓝桥杯C/C++语言A组

    一:题目: 标题:迷宫 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R ...

  6. 发现环——第八届蓝桥杯C语言B组(国赛)第四题

    原创 标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台 电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管 ...

  7. 2017年第八届蓝桥杯C/C++B组省赛题目解析

    一. 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优 ...

  8. 第三届蓝桥杯决赛c++b组

    1.星期几 [结果填空] (满分5分)     1949年的国庆节(10月1日)是星期六.      今年(2012)的国庆节是星期一.     那么,从建国到现在,有几次国庆节正好是星期日呢? 只要 ...

  9. 2017第八届蓝桥杯 K倍区间

    标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...

随机推荐

  1. .netcore 在linux 上运行 Helllo World 例子

    要想在linux上运行netcore ,需要在linux 安装netcore SKD 下面分两步完成, 首先我的操作系统是 Ubuntu 14.04 ,不同版本可以参考 官网给出的连接 https:/ ...

  2. 手机的RAM和ROM

    RAM是由英文Random Access Memory的首字母构成的,意为随机存储器,即在正常工作状态下可以往存储器中随时读写数据.根据存储单元工作原理的不同,RAM又可分为静态存储器(SRAM)和动 ...

  3. redux使用教程详细介绍

    本文介绍redux的使用 安装 cnpm install redux --save cnpm install react-redux --save cnpm install redux-devtool ...

  4. mysql应用基本操作语句(转)

    二.库操作 1..创建数据库 命令:create database <数据库名> 例如:建立一个名为xhkdb的数据库 mysql> create database xhkdb; 2 ...

  5. 冷扑大师AI简史:你用德扑来游戏,人家用来发Science

    前言 人类又输了...... 创新工场组织的一场“人工智能和顶尖牌手巅峰表演赛中”,机器人AI冷扑大师赢了人类代表队龙之队 792327 记分牌,最后 200 万奖励归机器人所有. 在围棋项目上人类的 ...

  6. python获得当前工作目录和修改

    import os  curDir = os.getcwd() 最近使用Python 写了很多脚本,想导入脚本,发现不知道如何查看python 的默认工作目录,并修改默认工作目录. 方法/步骤   查 ...

  7. leetcode860

    使用C++进行编码: bool lemonadeChange(vector<int>& bills) { ; ; ; int N = bills.size(); ; i < ...

  8. 关于JS正则表达式的一篇文章(转载)

    原文:http://www.cnblogs.com/xujh/archive/2008/08/21/1273525.html <input   onkeypress="return   ...

  9. 【259】ucpole.dat update

    2017年2月21日 57871 +0.020896 0.007232 +0.414732 0.009212 +0.418044 0.007533 p 57872 +0.022055 0.007284 ...

  10. 20行核心代码:jQuery实现省市二级联动

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...