博客
关于我
【 POJ - 1611 】 C - The Suspects(简单并查集)求集合中元素个数
阅读量:275 次
发布时间:2019-03-01

本文共 1943 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找出所有被怀疑的学生。学生0被怀疑后,所有与他同一群组的学生也会被怀疑,并且这些群组中的其他群组也会被怀疑。我们可以使用广度优先搜索(BFS)来处理这些群组,以确保所有相关的学生都被怀疑。

方法思路

  • 初始化:将学生0标记为怀疑。
  • 读取输入:读取学生数和群组数,然后读取每个群组的成员列表。
  • 建立映射:为每个学生记录他所在的所有群组。
  • BFS处理:使用队列进行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()

    代码解释

  • 读取输入:从标准输入读取数据,直到遇到n=0且m=0时结束。
  • 初始化数据结构groups存储每个群组的成员,student_groups记录每个学生所在的群组。
  • 标记怀疑状态:使用布尔数组Suspicious记录每个学生是否被怀疑。
  • 队列初始化:将所有包含学生0的群组加入队列。
  • BFS处理:处理每个群组及其成员,标记所有相关的学生为怀疑,并将这些群组的其他群组加入队列。
  • 统计结果:计算并输出被怀疑的学生数量。
  • 该方法确保了所有相关的学生都被正确标记为怀疑,时间复杂度为O(m + n + 总成员数),在给定的约束条件下是高效的。

    转载地址:http://ctao.baihongyu.com/

    你可能感兴趣的文章
    nodejs 运行CMD命令
    查看>>
    nodejs-mime类型
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs字符与字节之间的转换
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    NodeJs学习笔记002--npm常用命令详解
    查看>>
    nodejs封装http请求
    查看>>
    nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
    查看>>
    Nodejs异步回调的处理方法总结
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs服务端实现post请求
    查看>>
    nodejs框架,原理,组件,核心,跟npm和vue的关系
    查看>>
    Nodejs模块、自定义模块、CommonJs的概念和使用
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>