일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 기하 알고리즘
- 구현
- POI Solution
- 백준 온라인 저지
- JOI
- 14179
- Manacher 알고리즘
- 컨벡스 헐
- Z algorithm
- 그래프
- IOI 2013
- 세그먼트 트리
- Implementation
- ICPC 연습
- BAPC 2018
- BAPC
- Divide and conquer optimization
- Manacher's algorithm
- boj
- codeforces
- 8192
- DP
- JOI 2018
- 코드포스
- 기하
- convex hull
- 2794
- 볼록 껍질
- Z 알고리즘
- acmicpc.net
- Today
- Total
프로그래밍 연습장
[BOJ 9521] 색칠 공부 본문
https://www.acmicpc.net/problem/9521
서로 다른 색깔을 칠해야 함을 나타내는 연결관계의 그래프를 만든다. 방향이지만 무방향인 것처럼 생각해야 한다. 그래프의 out-degree가 1임을 이용해 대부분의 경우들을 eliminate해야 한다. 일반적인 모든 경우에 대해 어떻게 할 지 고민하다가 털린 쉬운 문제이다.
연결관계 그래프의 각 컴포넌트는 어떤 식으로 생겼을까?
1. 직선으로 생겼을 수도 있다.
2. 사이클을 이룰 수도 있다.
☆ 3. 그런데 사이클을 이루는 정점들에서는 다른 정점들로 나가는 degree가 존재할 수 없다. 자기들끼리 가리켜야 하니깐
4. 그래서, 그래프는 사이클들과 그 사이클들을 향해 뻗어있는 직선들로 이루어져 있을 것이다.
5. 물론, 직선 형태로 생긴 컴포넌트도 직선의 끝 정점이 자신을 향해 있어야 할 것이므로 '사이클을 향해 뻗어있다'고 말할 수 있을 것이다.
$n_i$개 정점으로 이루어진 직선에서는 $k \times {(k-1)}^{n_i-1}$개의 경우의 수가 있을 것이다.
사이클의 경우는 어떨까?
1개짜리 사이클은 $f(1) = k$개의 경우의 수가 있다. 2개짜리 사이클은 $f(2) = k(k-1)$개의 경우의 수가 있다. 3개짜리 사이클은 $f(3) = k(k-1)(k-2)$개의 경우의 수가 있다.
4개부터는 어떤 점화식을 얻어내야 할 것 같다. 이제는 모든 정점이 서로 다른 색깔을 가질 필요가 없으므로(4개짜리는 대각선에 있는 정점끼리는 다른 색을 가질 필요가 없다) 이들이 같은 색깔을 가지는 지 다른 색깔을 가지는 지 여부로 점화식을 분리해 낼 수 있을 것 같다.
정점을 $1$, $2$, $...$, $n$번으로 이름붙이자. 만약 $1$번 정점과 $n-1$번 정점이 같은 색을 가지고 있다면, $1$번부터 $n-2$번까지의 정점으로 이루어진 사이클을 칠하고 $k-1$개의 칠하는 가짓수($1$번 정점의 색 = $n-1$번 정점의 색과 달라야 할 것이다)가 있는 $n$번 정점을 칠하는 만큼의 가짓수가 있다: $(k-1)f(n-2)$. 반대로 두 정점이 다른 색을 가지고 있다면, 이번에는 $1$번부터 $n-1$번까지의 정점으로 이루어진 사이클을 칠하고 $k-2$개의 칠하는 가짓수가 있는 $n$번 정점을 칠하는 만큼의 가짓수가 있을 것이다: $(k-2)f(n-1)$.
따라서 $f(n) = (k-1)f(n-2) + (k-2)f(n-1)$.
그렇게 각 사이클에 대해서 사이클을 칠할 수 있는 방법의 수를 위 함수를 전처리함으로써 구할 수 있다. 그리고 각 사이클에 연결되어 있는 직선들은 사이클을 모두 채운 다음($f$ 함수값만큼의 가짓수가 있을 것이다.) 사이클에 가까운 순서로부터 채워나가면 각각 직전의 정점과만 다른 색으로 칠하면 되므로 $k-1$가지 가짓수로 채울 수 있다. 위에서 언급한 특수한 직선의 경우에도 $f(1) = k$를 생각하면 같은 식이 성립할 것이다.
따라서 답은 모든 사이클을 찾은 다음 각 사이클을 이루는 정점이 ${c}_{1}, ..., {c}_{t}$개씩이라면,
$$ {(k-1)}^{n - \sum_{i=1}^{t} {c}_{i} } \times \prod_{i=1}^{t} f({c}_{i}) $$
가 될 것이다.
그래프의 특수한 성질을 이용하여 가능한 그래프의 형태를 제한시켜 현실적인 점화식을 얻어냈다. 일반적인 그래프가 주어진다면 어떻게 풀 지는, 현실적인 시간 안에 풀 수가 있긴 할지는 고민해야 할 것 같다.
'문제 해결 > acmicpc.net' 카테고리의 다른 글
[BOJ 8192] Sheep (0) | 2018.02.11 |
---|---|
[BOJ 7332] 편의점 알바 (0) | 2017.08.28 |
[BOJ 8874] 웜뱃 (0) | 2017.08.27 |
[BOJ 14179] 크리스마스 이브 (0) | 2017.08.18 |
[BOJ 2794] MARS (0) | 2017.03.25 |