Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 트리의 특수 노드를 찾는 프로그램

<시간/>

n-ary 트리를 나타내는 'tree'라는 값의 2D 목록과 'color'라는 값의 또 다른 목록이 있다고 가정합니다. 트리는 인접 목록으로 표시되며 루트는 트리[0]입니다.

i번째 노드의 특성 -

  • tree[i]는 자식과 부모입니다.

  • color[i]는 해당 색상입니다.

루트가 N에 있는 하위 트리의 모든 노드가 고유한 색상을 갖는 경우 노드 N을 "특수"라고 부릅니다. 이 트리가 있으므로 특수 노드의 수를 찾아야 합니다.

So, if the input is like tree = [
   [1,2],
   [0],
   [0,3],
   [2]
]

색상 =[1, 2, 1, 1]이면 출력은 2가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 결과 :=0

  • dfs(0, -1)

  • 반환 결과

  • check_intersection() 함수를 정의합니다. 이것은 색상을 취할 것입니다, child_colors

    • (colors)의 길이 <(child_colors)의 길이인 경우

      • 색상의 각 c에 대해 수행

        • child_colors의 c가 0이 아니면

          • 참을 반환

    • 그렇지 않으면

      • child_colors의 각 c에 대해 수행

        • c가 child_colors에 있으면

          • 참을 반환

  • dfs() 함수를 정의합니다. 이것은 노드가 필요합니다. 이전

    • 색상 :={색상[노드]}

    • 트리[노드]의 각 자식에 대해 수행

      • 자식이 이전과 같지 않으면

        • child_colors :=dfs(자식, 노드)

        • colors 및 child_colors가 비어 있지 않으면

          • check_intersection(colors, child_colors)이 0이 아니면

            • 색상 :=null

          • 그렇지 않으면

            • if length of (colors)

              • child_colors :=child_colors 또는 색상

              • 색상 :=child_colors

            • 그렇지 않으면

              • 색상 :=색상 또는 자식 색상

        • 그렇지 않으면

          • 색상 :=null

      • 색상이 비어 ​​있지 않으면

        • 결과 :=결과 + 1

      • 색상 반환

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

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]))

입력

[
   [1,2],
   [0],
   [0,3],
   [2]
], [1, 2, 1, 1]

출력

2