蓝桥杯 2017 决赛 发现环 (求环内的点)

2024-04-05 23:48

本文主要是介绍蓝桥杯 2017 决赛 发现环 (求环内的点),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

历届试题 发现环  
时间限制:1.0s   内存限制:256.0MB
问题描述
小明的实验室有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

#include<stdio.h>
#include<string.h>
#include<vector> 
#include<stack>
using namespace std;
const int N = 100000+5;
int n;
bool vis[N];
vector<int> adj[N];
bool in_stack[N];
bool flag[N];
stack<int> s;void dfs(int cur,int fa){vis[cur] = true;s.push(cur);in_stack[cur] = true;for(int i = 0; i < adj[cur].size(); ++i){int v = adj[cur][i];if(!vis[v]){dfs(v,cur);}else if(in_stack[v] && fa != v){//不能是父节点int u;do{u = s.top();flag[u] = true;s.pop();}while(u != v);//return;  // 不知道为啥 不能 直接return; break;}}	if(!s.empty()) //这里如果不判断 直接出栈 会RE  从 100 -> 0 悲剧 s.pop();in_stack[cur] = false;	//出栈了必须标记 }int main(){scanf("%d",&n);int a,b;for(int i = 0; i < n; ++i){scanf("%d%d",&a,&b);adj[a].push_back(b);adj[b].push_back(a);}dfs(1,1); //图一定连通 所以 从一个点搜索就OK了 
//		for(int i = 1; i <= n; ++i){
//			if(!vis[i]){
//				dfs(i,i);
//			}
//		}for(int i = 1; i <= n; ++i){if(flag[i]){printf("%d ",i);}}return 0;}

方法二:tarjan变形(原算法主要针对有向图) 这里根据求割点的方法变形

关键在于:对顶点u 其子树经过 非父子边所能回到的最早的时间戳

#include<stdio.h>
#include<string.h>
#include<vector> 
#include<stack>
#include<algorithm>
using namespace std;
const int N = 100000+5;
int n;
bool vis[N];
vector<int> adj[N];
bool in_stack[N];
bool flag[N];
stack<int> s;
int index;
int low[N];
int dfn[N];
int color;
vector<int> cop[N];//记录每个连通分量 其实只有一个 void dfs(int cur,int fa){dfn[cur] = low[cur] = ++index;vis[cur] = true;s.push(cur);in_stack[cur] = true;for(int i = 0; i < adj[cur].size(); ++i){int v = adj[cur][i];if(!vis[v]){dfs(v,cur);low[cur] = min(low[cur],low[v]);}else if(in_stack[v] && v != fa){ //这是关键 不能是父节点 类似于判断割点 low[cur] = min(low[cur],dfn[v]);}}in_stack[cur] = false;if(low[cur] == dfn[cur]){ //说明是个连通分量 int u;++color;do{u = s.top();cop[color].push_back(u);s.pop();}while(u != cur);}	}int main(){scanf("%d",&n);int a,b;for(int i = 0; i < n; ++i){scanf("%d%d",&a,&b);adj[a].push_back(b);adj[b].push_back(a);}dfs(1,1); //图一定连通 所以 从一个点搜索就OK了 for(int i = 0; i < N; ++i){if(cop[i].size() > 1){for(int j = 0; j < cop[i].size(); ++j){sort(cop[i].begin(),cop[i].end());//排序 printf("%d ",cop[i][j]);}}}return 0;}

这篇关于蓝桥杯 2017 决赛 发现环 (求环内的点)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878487

相关文章

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

升级kali系统 进入后发现一直蓝屏

因为要出去晚饭 结果回来重启发现 一直蓝屏 感觉可能是升级过程中 什么软件的安装或者配置出了问题 就直接长按电源重启进入恢复模式 选择最新版的recovery Mode 然后输入  dpkg --configure -a 之后reboot重启  一切正常!

涉密电脑插U盘会不会被发现?如何禁止涉密电脑插U盘?30秒读懂!

在涉密电脑插U盘的那一瞬间,你是否也好奇会不会被发现?涉密电脑的安全监控可是滴水不漏的!想知道如何彻底禁止涉密电脑插U盘?简单几招搞定,轻松锁死外部设备,信息安全无懈可击! 涉密电脑插U盘会不会被发现? 涉密电脑是否会在插入U盘时被发现,需要根据具体情况来判断。在一些情况下,涉密电脑可能没有安装任何监控软件或安全工具,插入U盘可能不会立即触发警告。然而,随着信息安全管理的不断升级,越来越多

API安全 | 发现API的5个小tips

在安全测试目标时,最有趣的测试部分是它的 API。API 是动态的,它们比应用程序的其他部分更新得更频繁,并且负责许多后端繁重的工作。在现代应用程序中,我们通常会看到 REST API,但也会看到其他形式,例如 GraphQL 甚至 SOAP。 当我们第一次对某个目标进行安全测试时,我们需要做大量研究,以了解其主要功能以及它们在幕后如何工作。建议花一些时间来阅读有关目标及其服务的信息。例如,如果

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

2017 版本的 WebStorm 永久破解

1.  在IntelliJ官网中下载 最新版本的WebStorm   下载地址:https://www.jetbrains.com/webstorm/download/#section=windows 2. 获取注册码    获取地址:http://idea.lanyus.com/   点击获取注册码,然后将注册码复制,再打开最新版的WebStorm,将注册码粘贴到激活框中就大功告

linux 使用ffpmeg 发现转化目标必须是一个路径

一直有个疑惑  就是使用ffpmeg转码时,源文件和目标文件到底可以传URL地址还是必须为路径    下面就将实验 请看如下代码: 当源文件为一个URL地址时 ,目录为地址时  转码不成功 /usr/local/ffmpeg/bin/ffmpeg --ss 00:00:00 -t 0.01 -i http://www.baidu.com/1.mp4 -y -q:v 2 -f image2 h

发现个有趣的东西:Tweetable Mathematical Art(用三个140字符以内的函数生成一个1024尺寸的图片)

发现 我是在看《构建之法》这本书时,看到作者提到这个: 好厉害!用三段140字符以内的代码生成一张1024×1024的图片_IT新闻_博客园 这是2014年一个人在 Code Golf Stack Exchange (a question and answer site for programming puzzle enthusiasts and code golfers) 发起的编程挑战: