题目如下
小明的实验室有 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