原创


标题:发现环

小明的实验室有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 ;目的是在一棵树中,找到一个环路;假定选择在环路中的A结点作为环路的起点,则A结点也可以作为环

路的终点,由于不知哪个结点在环路中,要依次枚举结点 1~N;

假设用户输入的数据为:

1 2 (0)

1 3 (0)

2 4 (0)

2 5 (0)

5 6 (0)

5 7 (0)

6 7 (0)

第三列的(0/1/-1)数码的意义:

0 :此边未遍历

-1:此边经判断不在环上

1:此边在环上

在上图中,5-6-7组成环,现在从结点1(以结点1为起点和终点)开始遍历每条边(边的遍历顺序与用户输入的边的顺序有关);

在遍历过程中只有回到起点时,遍历结束。

搜索用户输入的N行数据,找到有数码1的某行(例子中为第1行),先将此行第三列的数码置1(代表遍历过),再以此行的另

一个结点(例子中为2)为起点,搜索N行数据中数码位为0的行数据(1代表遍历过),停留在第三行,将第三列数码位置1,再

以4为起点继续搜索,此时4为叶子结点,搜索数据未果,所以递归回来将 2 4 (1)——> 2 4 (-1)表示此边定不在环中;此时

再以2为起点继续搜索N行数据,停留在 2 5 (1);再以5为起点继续搜索,停留在 5 6(1),继续搜索停留在 6 7 (1),当停

留在 5 7 (1)的时候,虽然出现了环 5 - 6 - 7,但是不满足以 1 为终点,所以搜索失败(再以7为起点搜索未果);递归回来,

5 7 (-1); 6 7 (-1);5 6 (-1);2 5 (-1);继续以1为起点搜索......所以当以5为第一个起点搜索时,才会搜索成功。

#include<stdio.h>
#include<stdlib.h> int arr[][]={}; //分配3列
int N=;
int flag=; //flag==1 表示找到起点,返回
int unaccess=; void dfs(int num,int value){
int i=;
int j=;
for(i=;i<=N-;i++){
if(flag==){
break;
}
for(j=;j<=;j++){ //***************
if(i==N- && j== && arr[i][j]!=num){ //叶子结点
unaccess=;
break;
}
if(i==N- && j== && arr[i][j]==num){
if(arr[i][]==){ //叶子结点在第N行,这条边已经遍历过
unaccess=;
break;
}
}
//*************** if(arr[i][j]==num && arr[i][]==){
arr[i][]=; //***************
if(j==){
if(arr[i][]==value){ //判断是不是起点
flag=;
break;
}
}
else{
if(arr[i][]==value){
flag=;
break;
}
}
//*************** if(j==){
dfs(arr[i][],value);
if(flag==){
break;
}
if(unaccess==){
arr[i][]=-;
}
unaccess=;
}
else{
dfs(arr[i][],value);
if(flag==){
break;
}
if(unaccess==){
arr[i][]=-;
}
unaccess=;
}
} }
}
} int main(){
scanf("%d",&N); int i=;
int j=;
for(i=;i<=N-;i++){
for(j=;j<=;j++){
scanf("%d",&arr[i][j]);
}
} for(i=;i<=N-;i++){ //最后一列为0代表此边可以走
arr[i][]=;
} int num=;
for(num=;num<=N;num++){ // num代表起点和终点
dfs(num,num);
if(flag==){
break;
}
else{
for(int z=;z<=N-;z++){ //以新的起点继续dfs
arr[z][]=;
}
}
} int *RT; //此数组用来存放环中结点
RT=(int *)malloc(sizeof(int)*(N+));
for(i=;i<=N;i++){
RT[i]=;
} for(i=;i<=N-;i++){
if(arr[i][]==){
RT[arr[i][]]=;
RT[arr[i][]]=;
}
} for(i=;i<=N;i++){
if(RT[i]==){
printf("%d ",i);
}
}
free(RT);
return ;
}

有 错误 或 改良方法  欢迎提出。

12:49:48

2018-05-10

发现环——第八届蓝桥杯C语言B组(国赛)第四题的更多相关文章

  1. 希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题

    原创 标题:希尔伯特曲线 希尔伯特曲线是以下一系列分形曲线 Hn 的极限.我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和 ...

  2. 磁砖样式——第八届蓝桥杯C语言B组(国赛)第二题

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

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

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

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

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

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

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

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

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

  7. 第八届蓝桥杯C/C++ B组省赛----分巧克力

    分巧克力 问题描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...

  8. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  9. 2015年第六届蓝桥杯C/C++B组省赛题目解析

    一.奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其中 ...

随机推荐

  1. Linux入门-9 软件管理基础(CentOS)

    0. 源代码形式 1. RPM软件包管理 RPM RPM查询 RPM验证 2. YUM软件管理 YUM基本命令 YUM查询 创建YUM仓库 0. 源代码形式 绝大多数开源软件都是直接以源代码形式发布 ...

  2. linux性能系列--内存

    一.啥是内存呢? 回答:内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁.计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大. 内存(Memory)也被称为内存储器, ...

  3. Jackson实现Object对象与Json字符串的互转

    在项目开发过程中,当客户端与服务器响应时,数据交互是必不可少的.然而通过Json实现数据交互成为我们开发中的一部分,进而Jackson为我们的Json转化提供了很好的机制.下面我将利用实例总结如何使用 ...

  4. video设置视频的播放位置(本例中实现效果是视频第一次播放完成后,接下来中从视频的中间部位开始循环播放)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. JavaScript的DOM_通过元素的class属性操作样式

    使用 style 属性可以设置行内的 CSS 样式,而通过 id 和 class 调用是最常用的方法. <script type="text/javascript"> ...

  6. arc093F Dark Horse

    我们可以假设1的位置在1,并且依次与右边的区间合并.答案最后乘上2^n即可. 那么需要考虑1所在的区间与另一个区间合并时,另一个区间的最小值不能为特殊的. 直接求解很难,考虑容斥,钦定在哪几个位置必定 ...

  7. 【YY的GCD】

    设 \[f(n)=\sum_{i=1}^N\sum_{j=1}^M[(i,j)=n]\] 我们的答案显然是 \[ans=\sum_{p\in prime}f(p)\] 设 \[F(n)=\sum_{i ...

  8. ZooKeeper学习之路 (六)ZooKeeper API的简单使用(二)级联删除与创建

    编程思维训练 1.级联查看某节点下所有节点及节点值 2.删除一个节点,不管有有没有任何子节点 3.级联创建任意节点 4.清空子节点 ZKTest.java public class ZKTest { ...

  9. Hadoop学习之路(二十八)MapReduce的API使用(五)

    求所有两两用户之间的共同好友 数据格式 A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D, ...

  10. Kali-linux使用NVIDIA计算机统一设备架构(CUDA)

    CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构,该架构使用GPU能够解决复杂的计算问题.它包含了CUDA指令集架构(ISA ...