문제 링크
- http://icpc.me/2454
문제 출처
- 2011 KOI 고등부 3번
사용 알고리즘
- 그리디
시간복잡도
- $O(N \log N)$
풀이
일단 정점 하나를 잡아서 Rooted Tree로 만들어줍시다.
경로 단위로 묶기 때문에 같은 정점에 달려있는 서로 다른 세 간선은 한 집합에 묶일 수 없습니다. 그러므로 각 정점은 아래 3가지 상태 중 한 가지 상태에 속하게 됩니다.
- 서로 다른 두 자식 정점과 같이 묶인다.
- 자식 정점 한 개와 묶이고, 부모 정점과 묶일 가능성이 있다.
- 자식 정점과 묶이지 않고, 부모 정점과 묶일 가능성이 있다.
Rooted Tree에서 Tree DP 비슷한 느낌으로 각 정점 $i$마다 $(A_i, B_i)$ pair를 관리할 것입니다.
- $A_i$: $i$번 정점을 루트로 하는 서브 트리에서의 정답
- $B_i$: 이때 $i$번 정점을 포함하는 경로에 속한 정점 개수의 최솟값
당연히 $B_i$는 $K+1$ 이하가 되어야 합니다.
이제, 위에서 설명한 3가지 상태를 고려해서 정답을 찾아봅시다.
- 서로 다른 두 정점과 묶이는 경우: $i$의 자식 정점 두 개를 골라서 $B$값의 합이 $K$ 이하라면, 그 두 정점을 포함한 집합과 $i$를 묶을 수 있습니다. 이 경우 부모 정점과 묶일 수 없기 때문에 $B_i$를 $K+1$로 설정해줍니다. 그러므로 $(A_i, B_i) = (\sum A - 1, K+1)$이 됩니다.
- 자식 정점 한 개와 묶이는 경우: $i$의 자식 정점을 하나 골라서 $B$값이 $K$ 이하라면, 그 정점을 포함한 집합과 $i$를 묶을 수 있습니다. $(A_i, B_i) = (\sum A, \min(B) + 1)$이 됩니다.
- 자식 정점과 묶이지 않는 경우: $(A_i, B_i) = (\sum A+1, 1)$이 됩니다.
각 정점마다 가능한 $(A_i, B_i)$의 후보가 여러 개 있을 수 있는데, $A_i$가 가장 작은 것, $A_i$가 같다면 $B_i$가 가장 작은 것을 선택하는 것이 최적이라는 것을 증명할 수 있습니다.
전체 코드
1 |
|