📅  最后修改于: 2023-12-03 15:42:11.707000             🧑  作者: Mango
门| GATE CS 2018 | 第35题
给定一棵有n个结点的无向树和一个整数k,找到树的所有路径中,最多只包含k个结点,且包含恰好k个结点的路径的数量。
输入:
输出:
输入:
n = 4
edges = [[0, 1], [0, 2], [0, 3]]
k = 2
输出:
2
我们可以遍历树中的所有结点,用dfs函数统计经过每个结点的路径数。
dfs函数的输入参数包括当前遍历到的结点cur,已访问到的节点集合visited_node,当前已有的路径长度path_length,以及最多只能包含k个结点的限制。
根据题意,我们需要在dfs函数内判断当前路径的长度是否超出限制k,并且在长度等于k时统计路径数量。
在dfs函数内部,我们需要遍历当前结点的所有邻节点。对于每个邻节点,如果它还未被访问过,则将邻节点加入visited_node,并递归调用dfs函数。每次返回时,将邻节点从visited_node中移除。
时间复杂度:O(n!)
空间复杂度:O(n)
def dfs(cur, visited_node, path_length, k, edges, path_count):
if path_length == k:
path_count[0] += 1
return
visited_node.add(cur)
for neighbor in edges[cur]:
if neighbor not in visited_node:
dfs(neighbor, visited_node, path_length + 1, k, edges, path_count)
visited_node.remove(cur)
def count_paths(n, edges, k):
path_count = [0]
for i in range(n):
dfs(i, set(), 0, k, edges, path_count)
return path_count[0]