题目链接:1977. 信息中继 - AcWing题库
分析:
本题需要并查集的知识 建议不熟悉并查集的哥哥姐姐们先了解一下~
解题思路 :
对每头牛 i ,它和另一头牛 a[i] ,参加的是同一个通信链,以此为依据建立并查集。
不会陷入循环的牛的特点:通信链到某头不通信的牛处结束。而不通信的牛一定是根牛。
找到所有通信链(集合)的根牛(并查集的根节点),如果根牛还存在联络对象(说明该通信链还没结束,这头牛还要联系一头牛,且这头牛也在这个集合内),则这是一个存在循环的通信链。
AC代码 (Python3)
import sys
sys.setrecursionlimit(10000) # 修改递归深度 默认是999 这里N=1000 会爆掉
N = int(input())
group = [i for i in range(N+1)]
lst = [0]
def root(x) : # 并查集模版
if x != group[x] :
group[x] = root(group[x])
return group[x]
for i in range(1,N+1) :
ne = int(input())
lst.append(ne)
if ne : group[root(i)] = root(ne) # 合并
res = 0
for i in range(1,N+1) :
r = root(i) # 第i头牛的根结点
if not lst[r] : res += 1 # 如果这个根结点还会向其他牛传递信息 说明这是一个环 否则答案+1
print(res)



