2017第八届蓝桥杯决赛(C++ B组)4.发现环
时间:2022-06-09
本文章向大家介绍2017第八届蓝桥杯决赛(C++ B组)4.发现环,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
描述
小明的实验室有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;
}
- android多线程下载1
- ASP获取微信小程序的OpenID服务器端代码
- 手把手教你用python抢票回家过年 !(附代码)
- 技术总结:自动扩张WPF树型表格列宽
- 部署Microsoft .NET Framework 3.0[翻译]
- 性能优化总结(六):预加载、聚合SQL应用实例
- 性能优化总结(五):CSLA服务端如何使用多线程的解决方案
- 编辑-发布-开发分离:git作为NoSQL数据库
- 性能优化总结(四):预加载的设计
- 在Expression Blend中使用XAML建立3D应用程序
- 使用 Asp.net Future May 2007 开发Silverlight应用
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- RePractise前端篇: 前端演进史
- 性能优化总结(三):聚合SQL在GIX4中的应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Python读写文件的方法
- 反编译PyInstaller打包后的exe为py源码
- Qt多线程编程实战:MD5单项加密
- 高速上云/网络穿透/视频上云网关EasyNTS组网服务平台如何通过复制穿透结果实现外网到内网的访问?
- SpringBoot常用注解的简单理解
- Qt多线程编程之线程的同步和互斥
- TS 设计模式06 - 代理模式
- TS 设计模式07 - 观察者模式
- Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)
- 前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
- leet笔记-62.不同路径
- leet笔记-63.不同路径II
- 五分钟C语言实现数据结构 之 二叉树链式存储
- 视频上云/网络穿透/网络映射服务EasyNTS前端切换页面卡顿如何优化?
- [译] 在 Vue 组件中分离 UI 和业务逻辑