解题思路: 

图片3.png


关键点就在于怎么判断一个点是环上的点,还是一个普通的节点。每个点都统计度数(入度加上出度)。

如果我们从所有度为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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论