本文共 2470 字,大约阅读时间需要 8 分钟。
为了解决这个问题,我们需要找到每个分部从虫洞出发,通过虫洞遍历其他分部,使得访问的分部的或zFang价值之和最大的情况。每个分部只能通过虫洞通向一个特定的分部,这使得我们可以将问题分解为处理多个环和链结构。
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()
visited数组记录每个节点是否被访问过,ans数组记录每个节点的最大价值之和。这种方法确保了每个节点的ans值被正确计算,处理了环和链结构,保证了算法的高效性和正确性。
转载地址:http://ntil.baihongyu.com/