博客
关于我
【 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/

    你可能感兴趣的文章
    npm—小记
    查看>>
    npm上传自己的项目
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>