Programming/알고리즘

Euler Tour Tree 기반 노드 색칠 및 라벨 통계 처리: 서브트리와 경로에 색 정보를 효율적으로 반영하기

octo54 2025. 6. 4. 10:46
반응형

Euler Tour Tree 기반 노드 색칠 및 라벨 통계 처리: 서브트리와 경로에 색 정보를 효율적으로 반영하기

이번 글에서는 **Euler Tour Tree (ETT)**를 기반으로
**노드의 색칠(라벨링)**이나 색별 통계 집계
효율적으로 처리하는 방법을 소개합니다.

이는 트리 기반 소셜 네트워크, 유저 상태 관리, 서브트리 질의에서
자주 등장하는 문제로, ETT 구조에 세그먼트 트리, Lazy Propagation을 결합하여 해결합니다.


✅ 예제 문제 유형

  1. paint(u, color)
    → 노드 u의 색을 변경
  2. count_color(u, c)
    → u의 서브트리에서 색 c를 가진 노드의 수
  3. path_color_freq(u, v, c)
    → u–v 경로상에서 색 c를 가진 노드의 수

🧠 핵심 아이디어: Euler Tour + Segment Tree

  • 오일러 투어를 통해 트리를 배열로 변환:
    in[u], out[u]로 서브트리 구간 표현 가능
  • 색 정보를 배열 인덱스에 매핑
  • 각 색상마다 BIT or Segment Tree를 하나씩 만들어
    구간 쿼리 가능하게 구성

🛠 단계별 구현 전략

1. 오일러 투어 + 인덱싱

in_time = [0] * n
out_time = [0] * n
tour = []
time = 0

def dfs(u, p):
    global time
    in_time[u] = time
    tour.append(u)
    time += 1
    for v in tree[u]:
        if v != p:
            dfs(v, u)
    out_time[u] = time
    tour.append(u)
    time += 1

in_time[u] ~ out_time[u]까지가 서브트리 구간이 됨 (Euler Tour 2번 등장)


2. 색상별 Fenwick Tree 또는 Segment Tree 구성

class BIT:
    def __init__(self, n):
        self.N = n + 2
        self.tree = [0] * self.N

    def add(self, i, x):
        i += 1
        while i < self.N:
            self.tree[i] += x
            i += i & -i

    def sum(self, i):
        i += 1
        res = 0
        while i > 0:
            res += self.tree[i]
            i -= i & -i
        return res

    def range_sum(self, l, r):
        return self.sum(r) - self.sum(l - 1)

3. 색칠 및 쿼리 처리

반응형
color_bit = defaultdict(lambda: BIT(2 * n))  # 각 색마다 BIT

def paint(u, new_color):
    old_color = node_color[u]
    pos = in_time[u]
    color_bit[old_color].add(pos, -1)
    color_bit[new_color].add(pos, 1)
    node_color[u] = new_color

def count_color_subtree(u, color):
    l = in_time[u]
    r = out_time[u]
    return color_bit[color].range_sum(l, r)

✅ 경로 쿼리 처리 (path_color_freq)

Euler Tour Tree 기반에서는 Segment Tree + LCA 활용 또는
Link/Cut Tree에서 경로 추출 후 색 개수 집계로 구현 가능.

복잡도 측면에서는 일반적으로:

  • 정적 트리라면 → Heavy-Light Decomposition + Segment Tree
  • 동적 트리라면 → ETT + BIT 구조 or LCT + Augmented Node

📘 응용 문제 예시

문제 내용

백준 24230 트리 색칠 최소 변경 횟수
AtCoder ABC 222E 트리 경로의 색상 분포 통계
Codeforces 1328E 노드 색별 경로 존재 판별

✅ 정리 요약

  • 트리의 색 분포/라벨 통계 문제는 ETT + 세그먼트 트리로 풀 수 있다.
  • Euler Tour를 통해 트리를 배열처럼 다루면,
    서브트리 구간 질의가 단순한 Range Query로 변환된다.
  • 색별로 BIT/Segment Tree를 구성해 빠르게 색 정보를 집계할 수 있다.

👉 다음 글에서는 **Heavy-Light Decomposition(HLD)**으로
경로상의 값 변경/질의를 고속 처리하는 방법을 설명합니다.


📚 참고자료

  • CP-Algorithms – Tree queries
  • AtCoder Typical DP Contest – 색분포 문제
  • IOI/JOI 경로 라벨링 문제 해설
  • cp-algorithms.com/graph/euler-tour-technique.html

 

EulerTourTree, 색칠문제, 라벨통계, 트리쿼리, 서브트리색상, 트리색분포, SegmentTree, BIT, 파이썬알고리즘, SEO 최적화 10개