博客
关于我
魔方俱乐部
阅读量:315 次
发布时间:2019-03-03

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

为了解决这个问题,我们需要找到每个分部从虫洞出发,通过虫洞遍历其他分部,使得访问的分部的或zFang价值之和最大的情况。每个分部只能通过虫洞通向一个特定的分部,这使得我们可以将问题分解为处理多个环和链结构。

方法思路

  • 问题分析:每个分部只能有一个出边,因此整个结构由多个环和链组成。环中的每个节点都可以访问整个环,而链结构则需要从终点逆向处理。
  • 递归DFS:使用深度优先搜索(DFS)来遍历每个节点,记录路径以检测环。对于环中的节点,计算环的总价值,并将每个节点的ans值设为这个总价值。对于链结构,从终点逆向处理。
  • 环处理:当在DFS中发现环时,计算环的总价值,并将环中的所有节点的ans值设为这个总价值。
  • 链处理:对于链结构,从终点开始逆向处理,计算每个节点的ans值。
  • 解决代码

    def main():    import sys    sys.setrecursionlimit(1 << 25)    n = int(sys.stdin.readline())    orz = list(map(int, sys.stdin.readline().split()))    F = list(map(int, sys.stdin.readline().split()))    F = [0] + F  # 1-based indexing    visited = [False] * (n + 1)    ans = [0] * (n + 1)    for i in range(1, n + 1):        if not visited[i]:            stack = []            current = i            while True:                if visited[current]:                    if current in stack:                        idx = stack.index(current)                        cycle = stack[idx:]                        sum_orz = sum(orz[node - 1] for node in cycle)                        for node in cycle:                            ans[node] = sum_orz                        for node in stack[:idx]:                            if F[node] == node:                                ans[node] = orz[node - 1]                            else:                                ans[node] = orz[node - 1] + ans[F[node]]                        break                    else:                        break                visited[current] = True                stack.append(current)                current = F[current]                if current in stack:                    idx = stack.index(current)                    cycle = stack[idx:]                    sum_orz = sum(orz[node - 1] for node in cycle)                    for node in cycle:                        ans[node] = sum_orz                    for node in stack[:idx]:                        if F[node] == node:                            ans[node] = orz[node - 1]                        else:                            ans[node] = orz[node - 1] + ans[F[node]]                    break    for i in range(1, n + 1):        print(ans[i])if __name__ == "__main__":    main()

    代码解释

  • 输入处理:读取输入数据,初始化或zFang价值数组和虫洞指向数组。
  • 初始化数组visited数组记录每个节点是否被访问过,ans数组记录每个节点的最大价值之和。
  • 遍历每个节点:对于每个未被访问的节点,使用非递归DFS遍历。
  • 检测环:在DFS过程中,检查是否形成环。如果形成环,计算环的总价值,并将环中的节点的ans值设为这个总价值。
  • 处理链结构:对于链结构,从终点开始逆向处理,计算每个节点的ans值。
  • 输出结果:输出每个节点的最大价值之和。
  • 这种方法确保了每个节点的ans值被正确计算,处理了环和链结构,保证了算法的高效性和正确性。

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

    你可能感兴趣的文章
    Python基础 | 关于“循环”那些事
    查看>>
    python系列【仅供参考】:python之subprocess模块rsync拉取文件
    查看>>
    python系列【仅供参考】:python 远程rdp
    查看>>
    python基础
    查看>>
    Python基本语法与变量类型
    查看>>
    python基本数据类型(容器)- tuple list dict set
    查看>>
    python基本工资的调整方案_Python薪资又涨了!这可咋办!
    查看>>
    Python基准测试和性能分析内存管理和垃圾回收
    查看>>
    Python基于RESTful风格的接口自动化测试实战
    查看>>
    python基于pygame实现跨年烟花效果
    查看>>
    python基于flask搭建http服务(四)—— Docker容器化部署
    查看>>
    python基于flask搭建http服务(二)—— 实现Excel上传、数据清洗、入库
    查看>>
    python基于flask搭建http服务(三)—— 使用gunicorn部署项目
    查看>>
    python基于flask搭建http服务(一)—— 实现数据查询和Excel导出
    查看>>
    Python块键盘/鼠标输入
    查看>>
    Python在正确的时区获取当前时间
    查看>>
    python在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
    查看>>
    python系列【仅供参考】:python tornado 集成redis消息订阅的异步任务之后tornado主程序无法启动,解决方案
    查看>>
    Python在列表理解中使用枚举
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>