程序以python查找所有城市的最大可能人口
考虑一个表示为具有N个节点和N-1边缘的树的国家。现在,每个节点代表一个城镇,每个边沿代表一条道路。我们有两个数字列表,分别是大小为N-1的数字源和目标。根据他们,第i条道路将source[i]连接到dest[i]。道路是双向的。我们还有另一个数字列表,称为人口规模N,其中,人口[i]代表第i个镇的人口。我们正在尝试将一些城镇升级为城市。但是,不应有两个城市彼此相邻,并且与城镇相邻的每个节点都应该是一个城市(每条道路都必须连接一个城镇和一个城市)。因此,我们必须找到所有城市的最大可能人口。
因此,如果输入类似于source=[2,2,1,1]dest=[1,3,4,0]人口=[6,8,4,4,3,5],那么输出将为15,因为我们可以将城市0、2和4升级为6+4+5=15的人口。
为了解决这个问题,我们将遵循以下步骤-
adj:=通过使用source和dest创建图的邻接表
定义一个功能dfs()
。这将需要x,选择
如果看到x,则
返回0
将x标记为可见
回答:=0
如果选择为真,则
ans:=ans+人口[x]
对于adj[x]中的每个邻居,执行
ans:=ans+dfs(邻居,选择逆)
返回ans
从主要方法执行以下操作:
x:=dfs(0,真)
返回x和((总和)-x)的最大值
让我们看下面的实现以更好地理解-
例
from collections import defaultdict class Solution: def solve(self, source, dest, population): adj = defaultdict(list) for a, b in zip(source, dest): adj[a].append(b) adj[b].append(a) seen = set() def dfs(x, choose): if x in seen: return 0 seen.add(x) ans = 0 if choose: ans += population[x] for neighbor in adj[x]: ans += dfs(neighbor, not choose) return ans x = dfs(0, True) return max(x, sum(population) - x) ob = Solution()source = [2, 2, 1, 1] dest = [1, 3, 4, 0] population = [6, 8, 4, 3, 5] print(ob.solve(source, dest, population))
输入值
[2, 2, 1, 1], [1, 3, 4, 0], [6, 8, 4, 3, 5]
输出结果
15