解题思路:
关键点就在于怎么判断一个点是环上的点,还是一个普通的节点。每个点都统计度数(入度加上出度)。
如果我们从所有度为1的点开始访问,对子节点的度数减少1,并判断子节点度数是否为1,为1才可以继续访问,如图1中c到e点,e点度减小为1,然后可以继续访问b,b点度数减小为2,不再继续访问子节点,相似的从a和d点开始访问点,发现b点度数减小为0,不存在环,但在图二中b点的度就不可能为1或0,最终一定会减少到2不变。自己通过2图推导一下。
参考代码:
from collections import deque
n = int(input())
que = deque()
mp = [[] for _ in range(n + 1)]
du = [0 for i in range(n + 1)]
for _ in range(n):
a, b = map(int, input().split())
mp[a].append(b)
mp[b].append(a)
du[a] += 1
du[b] += 1
def bfs():
for i in range(1, len(du)):
if du[i] == 1:
que.append(i)
while que:
tmp = que.popleft()
for i in mp[tmp]:
du[i] -= 1
if du[i] == 1:
que.append(i)
bfs()
ans = []
for i in range(1, n + 1):
if du[i] == 2:
ans.append(i)
ans.sort()
for i in range(len(ans)):
print(ans[i], end=' ')
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复