문제 링크
- https://icpc.me/8916
문제 출처
- 2010 대전 리저널 E번
사용 알고리즘
- DP
시간복잡도
- $O(N + \log P)$
풀이
이진 트리를 위상 정렬하는 경우의 수를 구하는 문제입니다.
현재 정점 $v$의 자식 정점 $c_1, c_2$를 루트를 하는 서브트리를 위상 정렬하는 경우의 수를 각각 $f_1, f_2$, 서브트리의 크기를 각각 $s_1, s_2$라고 합시다. 첫번째 서브트리의 정점에 모두 1이라는 라벨을 붙이고, 두번째 서브트리의 정점에 모두 2라는 라벨을 붙이면, (중복이 있는 순열의 개수) * $f_1$ * $f_2$를 구하면 됩니다.
그러므로 $v$를 루트로 하는 서브트리를 위상 정렬하는 경우의 수는 $\frac{(s_1+s_2)!}{s_1!s_2!}f_1f_2$이고, 트리 DP를 이용해 문제를 해결할 수 있습니다.
전체 코드
1 |
|