蓝桥杯——发现环(python)

这篇博客讨论了如何解决一个关于网络环路的蓝桥杯编程竞赛题目。通过使用Python,作者提出了一种避免并查集的方法,即通过统计每个节点的入度,并利用广度优先搜索(BFS)遍历来寻找环路中的电脑。具体步骤包括统计入度,维护一个队列处理入度为1的节点,以及检查循环结束后入度大于1的节点,这些节点即为环路中的电脑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下

小明的实验室有 N 台电脑,编号1⋯N。原本这 N 台电脑之间有 N−1 条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。

不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了 BUG。

为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?

输入描述
输入范围:

第一行包含一个整数 N。

以下 N 行每行两个整数 a,b,表示 a 和 b 之间有一条数据链接相连。

其中, 1 < N <10^5, 1 < a, b < N

输入保证合法。

输出描述
按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。

输入输出样例
示例
输入

5
1 2
3 1
2 4
2 5
5 3

输出

1 2 3 5

题目解析

说实话,我第一眼看到这道题的第一个思路就是并查集!!!,但是仔细想想考场上并查集写错了怎么办,并查集还需要自己去书写,难道就没有别的方法了吗?
我思考尝试用一个列表储存关系,一个储存与他联通的个数,然后利用bfs进行遍历,寻找到一个找到一个就开始减。
具体步骤:
1.统计所有点的入度;
2.创建一个队列维护所有入度为 1 的点,将所有度等于 1 的节点加入队列。(本题中没有独立的节点,所以不用考虑度为 0 的情况);
3.当队列不为空时,弹出队首元素,把与队首元素相邻的节点入度减 1,如果相邻节点度数变为 1,则将相邻节点加入队列;
4.循环结束后,从小到大判断每个结点的入度,若入度大于 1,则说明该节点在环内,输出该节点。(在环中的所有点的度都会大于二的)

代码如下

# encoding:utf-8
from queue import Queue


a = [0 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leosaf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值