Cho danh sách cạnh (u, v) biểu diễn một cây. Với mỗi cạnh, tìm số lượng đường đi duy nhất (unique paths) chứa cạnh đó. Kết quả trả về theo thứ tự cạnh đầu vào.
Ví dụ: edges = [[0,1],[0,2],[1,3],[1,4]] → kết quả [6, 4, 4, 4].
Giải thuật (DFS tính kích thước subtree)
- Xây dựng danh sách kề
adjtừ các cạnh. - DFS từ gốc (0) để tính
count[x]= số nút trong subtree gốc tạix. - Với mỗi cạnh
(a, b), giả sửalà cha củab(hoặc ngược lại). Kích thước một bên làx = min(count[a], count[b]). Số đường đi qua cạnh đó =x * (N - x)vớiN = count[0].
Ví dụ minh họa
from collections import defaultdict
class Solution:
def solve(self, edges):
adj = defaultdict(list)
for a, b in edges:
adj[a].append(b)
adj[b].append(a)
count = defaultdict(int)
def dfs(x, parent):
count[x] = 1
for nb in adj[x]:
if nb == parent:
continue
count[x] += dfs(nb, x)
return count[x]
dfs(0, -1)
N = count[0]
ans = []
for a, b in edges:
x = min(count[a], count[b])
ans.append(x * (N - x))
return ans
ob = Solution()
edges = [[0,1],[0,2],[1,3],[1,4]]
print(ob.solve(edges)) # Output: [6, 4, 4, 4]
Đầu vào / Đầu ra
Input: [[0,1],[0,2],[1,3],[1,4]]
Output: [6, 4, 4, 4]