You are given an undirected tree rooted at node 0 with n nodes numbered from 0 to n - 1, represented by a 2D array edges of length n - 1, where edges[i] = [ui, vi, lengthi] indicates an edge between nodes ui and
vi with length lengthi. You are also given an integer array nums, where
nums[i] represents the value at node i.
A special path is defined as a downward path from an ancestor node to a descendant node such that all the values of the nodes in that path are
unique.
Note that a path may start and end at the same node.
Return an array result of size 2, where result[0] is the length of the
longest special path, and result[1] is the minimum number of nodes in all possiblelongest special paths.
Input: edges =[[0,1,2],[1,2,3],[1,3,5],[1,4,4],[2,5,6]], nums =[2,1,2,1,3,1]Output: [6,2]Explanation:
#### In the image below, nodes are colored by their corresponding values in`nums`
The longest special paths are `2 -> 5` and `0 -> 1 -> 4`, both having a length
of 6. The minimum number of nodes across all longest special paths is2.
Input: edges =[[1,0,8]], nums =[2,2]Output: [0,1]Explanation:

The longest special paths are `0` and `1`, both having a length of 0. The
minimum number of nodes across all longest special paths is1.
We need to find the longest downward path in a tree where all node values are unique. We use DFS to explore all paths, keeping track of visited values with a set. For each node, we try all children, backtracking as needed, and update the answer if a longer path is found. For ties in length, we track the minimum number of nodes.
classSolution:
deflongestSpecialPath(self, edges: list[list[int]], nums: list[int]) -> list[int]:
from collections import defaultdict
n = len(nums)
g = defaultdict(list)
for u, v, w in edges:
g[u].append((v, w))
g[v].append((u, w))
max_len, min_nodes =0, n+1defdfs(u: int, p: int, st: set[int], length: int, nodes: int):
nonlocal max_len, min_nodes
if length > max_len or (length == max_len and nodes < min_nodes):
max_len = length
min_nodes = nodes
for v, w in g[u]:
if v == p or nums[v] in st:
continue st.add(nums[v])
dfs(v, u, st, length + w, nodes +1)
st.remove(nums[v])
for i in range(n):
dfs(i, -1, {nums[i]}, 0, 1)
return [max_len, min_nodes]