本文共 1943 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找出所有被怀疑的学生。学生0被怀疑后,所有与他同一群组的学生也会被怀疑,并且这些群组中的其他群组也会被怀疑。我们可以使用广度优先搜索(BFS)来处理这些群组,以确保所有相关的学生都被怀疑。
import sysfrom collections import dequedef main(): while True: n, m = map(int, sys.stdin.readline().split()) if n == 0 and m == 0: break groups = [] student_groups = [[] for _ in range(n)] # student_groups[i] stores the groups that student i belongs to for h in range(m): parts = list(map(int, sys.stdin.readline().split())) k = parts[0] members = parts[1:] groups.append(members) for m_i in members: student_groups[m_i].append(h) suspicious = [False] * n suspicious[0] = True queue = deque() for h in range(m): if 0 in groups[h]: queue.append(h) processed = [False] * m while queue: current_group = queue.popleft() if processed[current_group]: continue processed[current_group] = True for member in groups[current_group]: if not suspicious[member]: suspicious[member] = True for prime_group in student_groups[member]: if not processed[prime_group]: queue.append(prime_group) processed[prime_group] = True count = sum(suspicious) print(count)if __name__ == "__main__": main()
groups存储每个群组的成员,student_groups记录每个学生所在的群组。Suspicious记录每个学生是否被怀疑。该方法确保了所有相关的学生都被正确标记为怀疑,时间复杂度为O(m + n + 总成员数),在给定的约束条件下是高效的。
转载地址:http://ctao.baihongyu.com/