Giả sử chúng ta có một danh sách 2D các giá trị được gọi là 'cây' đại diện cho một cây n-ary và một danh sách các giá trị khác được gọi là 'màu'. Cây được biểu diễn dưới dạng danh sách kề và gốc của nó là cây [0].
Các đặc điểm của nút thứ i -
-
tree [i] là con và cha của nó.
-
color [i] là màu của nó.
Chúng ta gọi một nút N là "đặc biệt" nếu mọi nút trong cây con có gốc ở N có một màu duy nhất. Vì vậy, chúng ta có cây này, chúng ta phải tìm ra số lượng các nút đặc biệt.
So, if the input is like tree = [ [1,2], [0], [0,3], [2] ]
color =[1, 2, 1, 1], thì đầu ra sẽ là 2.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
kết quả:=0
-
dfs (0, -1)
-
trả về kết quả
-
Định nghĩa một hàm check_intersection (). Thao tác này sẽ có màu sắc, child_colors
-
nếu độ dài của (màu) <độ dài của (màu_ con) thì
-
đối với mỗi c trong màu sắc, làm
-
nếu c trong child_colors khác 0 thì
-
trả về True
-
-
-
-
nếu không,
-
đối với mỗi c trong child_colors, thực hiện
-
nếu c có trong màu con thì
-
trả về True
-
-
-
-
-
Định nghĩa một hàm dfs (). Điều này sẽ chiếm nút, trước
-
màu sắc:={color [node]}
-
đối với mỗi phần tử con trong cây [node], thực hiện
-
nếu đứa trẻ không giống trước đó, thì
-
child_colors:=dfs (con, nút)
-
nếu màu sắc và màu con không trống, thì
-
nếu check_intersection (color, child_colors) khác 0 thì
-
màu sắc:=null
-
-
nếu không,
-
nếu độ dài của (màu sắc) <độ dài của (màu sắc con), thì,
-
child_colors:=child_colors HOẶC màu
-
màu sắc:=child_colors
-
-
nếu không,
-
màu sắc:=màu sắc HOẶC màu con
-
-
-
-
nếu không,
-
màu sắc:=null
-
-
-
nếu màu không trống thì
-
kết quả:=kết quả + 1
-
-
trả lại màu sắc
-
-
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
import collections class Solution: def solve(self, tree, color): self.result = 0 def dfs(node, prev): colors = {color[node]} for child in tree[node]: if child != prev: child_colors = dfs(child, node) if colors and child_colors: if self.check_intersection(colors, child_colors): colors = None else: if len(colors) < len(child_colors): child_colors |= colors colors = child_colors else: colors |= child_colors else: colors = None if colors: self.result += 1 return colors dfs(0, -1) return self.result def check_intersection(self, colors, child_colors): if len(colors) < len(child_colors): for c in colors: if c in child_colors: return True else: for c in child_colors: if c in colors: return True ob = Solution() print(ob.solve( [ [1,2], [0], [0,3], [2] ], [1, 2, 1, 1]))
Đầu vào
[ [1,2], [0], [0,3], [2] ], [1, 2, 1, 1]
Đầu ra
2