📜  门| GATE CS 2018 |第 35 题(1)

📅  最后修改于: 2023-12-03 15:42:11.707000             🧑  作者: Mango

题目

门| GATE CS 2018 | 第35题

题目描述

给定一棵有n个结点的无向树和一个整数k,找到树的所有路径中,最多只包含k个结点,且包含恰好k个结点的路径的数量。

参数

输入:

  • n: 整数,表示树的结点数
  • edges: 二维列表,表示树的边
  • 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]