K-Graph Coloring
๐ซ K-Graph Coloring
๐ซง Graph Coloring
์ ์ , ๊ฐ์ , ๋ฉด์ ๊ธฐ์ค์ผ๋ก ์ธ์ ํ ๊ตฌ์ฑ ์์๊ฐ ๊ฐ์ ์์ด ๋์ง ์๋๋ก ์น ํ๋ ๋ฌธ์
๊ฐ์ , ๋ฉด ์ฑ์์ด ์ ์ ์ฑ์์ผ๋ก ๋ณํ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋๊ฐ ์ ์ ์ฑ์์ ์๋ฏธ
- ๊ฐ์ ์ฑ์ : ์ ๊ทธ๋ํ์ ๋ํ ์ ์ ์ฑ์ ๋ฌธ์ ๋ก ๋ณํ๊ฐ๋ฅ
- ๋ฉด ์ฑ์ : ์ด์ค(Dual) ๊ทธ๋ํ์ ๋ํ ์ ์ ์ฑ์ ๋ฌธ์ ๋ก ๋ณํ๊ฐ๋ฅ
- ๋ฃจํ๋ฅผ ๊ฐ๋ ์ ์ ์ ์ฑ์์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ๋ฃจํ๊ฐ ์๋ ๊ทธ๋ํ๋ฅผ ๋์
๐ซง K-Graph Coloring
์ต๋ k ๊ฐ์ ์๋ก ๋ค๋ฅธ ์์ ๊ฐ์ง๊ณ , ์ ์ ์ฑ์์ด ๊ฐ๋ฅํ์ง ํ์ธํ๋ ๊ฒฐ์ ๋ฌธ์
๊ฐ๋ฅ ์ฌ๋ถ
๋ง์ ํ์ธ
์ด๋ค ์์ธ์ง๋ ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์, ์์ ์ ์๋ก ํํ (1, 2, 3)
๐ซง ๊ทธ๋ํ์ ์ฑ์์ (Chromatic Number)
๊ทธ๋ํ๋ฅผ ์ฑ์ํ๊ธฐ ์ํด ์ต์๋ก ํ์ํ ์๊น์ ์๋ฅผ ์์๋ด๋ ๋ฌธ์
- n์ ์ ์์ ๊ทธ๋ํ(๋ชจ๋ ์ ์ ์ด ์ฐ๊ฒฐ๋-์ธ์ ํ) : n
- ํธ๋ฆฌ : 2
- ๋จ์ํ ์ง๋ : 3์์ด๋ฉด ์ถฉ๋ถ
- ํ์๊ฐ์ ์์ญ์ ๋๋ฌ์ธ์ธ ์์ญ์ด ์๋ค๋ฉด : 4
- ์ง๋๋ฅผ ๊ทธ๋ฆด ๋ ๋๋ผ ๊ตฌ๋ถ์ ์์ผ๋ก ํ๋๋ฐ, ๊ณผ๊ฑฐ ์ํฌ๊ฐ ๋น์ธ์ ์ต์ํ์ ์์ผ๋ก ํ์ํ๊ณ ์
๐ซง ์์ฉ
- ์ปดํ์ผ๋ฌ์์์ ๋ ์ง์คํฐ ํ ๋น ๋ฌธ์ ๋ฅผ ๋ชจ๋ธ๋ง
- ๋ชฉ์ ์ฝ๋์ ์คํ ์๊ฐ์ ์ค์ด๊ธฐ ์ํ์ฌ ์ฝ๋์ต์ ํ์์ ์ฌ์ฉํ๋ ๊ธฐ์ ์ค ํ๋๋ ์ปดํ์ผ๋ ํ๋ก๊ทธ๋จ๋ด์ ์์ฃผ ์ฐ์ด๋ ๊ฐ์ ์ด์์ด๋ฉด ๋น ๋ฅธ ๋ ์ง์คํฐ์ ๋ฐฐ์
- ๋ณ์๋ฅผ ์ ์ ์ผ๋ก, ๋์์ ํ์ํ ๋ณ์๋ค ์ฌ์ด๋ฅผ ๊ฐ์ ์ผ๋ก ๋ํ๋ด๋ ๊ฐ์ญ ๊ทธ๋ํ๋ฅผ ๊ตฌ์ถํ๊ณ k ์์ผ๋ก ์ฑ์ ๊ฐ๋ฅํ๋ค๋ฉด ์ด๋ค ๊ฒฝ์ฐ๋ผ๋ ๋์์ ํ์ํ ๋ณ์๋ค์ ์ต๋ k ๊ฐ์ ๋ ์ง์คํฐ์ ์ ์ฅ ๊ฐ๋ฅ
์ค๋์ฟ : 9-์ฑ์ ๋ฌธ์ ๋ฅผ 81์ ์ ๊ทธ๋ํ์ ์ ์ฉํ๋ ๊ฒ
- ๋ค์ํ ์ค์ผ์ค๋ง ๋ฌธ์
- ๊ฐ ์์ ๋ค์ ๋์ผํ ์๊ฐ์ ํ ๋นํ๋ค๊ณ ๊ฐ์ ํ ๋, ๊ฐ ์์ ์ ์ ์ ์ผ๋ก ํ๊ณ , ๊ฒน์ณ์ ์งํํ ์ ์๋ ์์ ๋ค์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐํ ๊ทธ๋ํ๋ฅผ ์๊ฐํด๋ณด์. ์ด ๊ทธ๋ํ๋ฅผ ๋์์ผ๋ก ์ฑ์์๋ฅผ ๊ตฌํ๋ค๋ฉด ์ด๋ก๋ถํฐ ์ต์ ์๋ฃ ์๊ฐ์ ๊ตฌํ ์ ์์
๐ซ Solve By BackTracking
i.e. ์ง๋ ์ฑ์ ๋ฌธ์
๋ฉด ์ฑ์ โ ์ ์ ์ฑ์, ๊ฐ ์์ญ(์ ์ )์ 1 ~ n๊น์ง ๋ฒํธ๋ฅผ ๋งค๊น
๐ซง ์ํ ๊ณต๊ฐ ํธ๋ฆฌ
์๋ฌด๊ฒ๋ ์น ํ์ง ์์ ๋น์ด์๋ ์ง๋์์ ์ถ๋ฐ
๋ ๋ฒจ i์ ๋
ธ๋๋ค์ ์ ์ 1์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ ์ i ๊น์ง ์ฑ์ํ ์ํ
๋จ๋ง ๋
ธ๋์ ๋ ๋ฒจ์ ๋น์ฐํ n
์ ๋งํ์ง ์์ ๋
ธ๋๋ฅผ ํ๋ณ: ์ธ์ ํ ์ ์ ์ ๊ฐ์ ์์ผ๋ก ์น ํด์๋ ์ ๋๋ค!!
@ KGC_0000, Start ๋
ธ๋๋ก ์์ํด์ ๋ด๋ ค๊ฐ๋, ๊ฐ ๋
ธ๋์๋ (์ ์ , ์)์ผ๋ก ๋งํน๋ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ
@ KGC_0001, Start ๋
ธ๋๋ก ์์ํด์ ๋ด๋ ค๊ฐ๋, ๊ฐ ๋
ธ๋์๋ (์ ์ , ์)์ผ๋ก ๋งํน๋, ์ ๋งํ์ง ์์ ๋
ธ๋๋ x๋ก ํ์ํ๊ณ ํจ์คํ, ์ต์ข
์ํ ๋
ธ๋๊ฐ ํ์๋, ์ํ ๊ณต๊ฐ ํธ๋ฆฌ
๊ฐ๋ฅ ์ฌ๋ถ๋ง ์ฐพ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ์ต์ข ์ํ ๋ ธ๋๋ฅผ ์ฐพ์ผ๋ฉด ๋
๐ซง ์๊ณ ๋ฆฌ๋ฌ
Back-Tracking, ์ค์ ๋ก ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ง๋ ์๊ณ , ๊ฐ ๋ ๋ฒจ์ ํด๋นํ๋ ์ํ ์ ๋ณด๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ์ตํด์ผ ํ ์ ๋ณด๋ โ๊ฑธ์ด์จ ๊ธธโ
- ๋ ๋ฒจ
i
๋ ธ๋๋i
๊ฐ์ ์ ์ ์ ์์ ๊ธฐ์ตํด์ผ ํจ- ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ฌ ์์ ๋
ธ๋๋ก ๋ด๋ ค๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
i + 1
๊ฐ ์ ์ ์ ์์ ๊ธฐ์ต - ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ง ์์ ๋ถ๋ชจ ๋
ธ๋๋ก ๋๋์๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
i - 1
๊ฐ ์ ์ ์ ์์ ๊ธฐ์ต
- ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ฌ ์์ ๋
ธ๋๋ก ๋ด๋ ค๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
์ธ๋ฑ์ค | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
์ | 1 | 2 | 2 | 3 | 1 | 2 | 1 | 1 | 3 |
@ KGC_0002
- ๋ฐฐ์ด ์ธ๋ฑ์ค : ์ ์
- ๋ฐฐ์ด ๊ฐ: ํด๋น ์ ์ ์ ์น ํ ์
โด n ๊ฐ์ ์์ ์ ์ฅํ ์ ์๋ 1์ฐจ์ ๋ฐฐ์ด์ด ํ์
๐ซง ๊ตฌํ
ColoringBT(0)
์ ํธ์ถํจ์ผ๋ก์จ ์์
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
31
32
33
34
35
36
37
void ColoringBT(int i) // ๋
ธ๋๊ฐ ์๋๋ผ ๋ ๋ฒจ, ๋ ๋ฒจ์ ๋ํ ์ฒ๋ฆฌ
{
if (!Promising(i)) // ์ ๋งํ์ง ์์ผ๋ฉด ํจ์ค
return;
// ๋ง์ง๋ง ํ์ด๋ฉด ๋
// ์ ๋ฐ๋ก ๋์ด๋๋ฉด, ์ ๋งํ ๋
ธ๋์ ๋ํด์๋ง ๊ฒ์ฌ๋ฅผ ํ๋๊น (์์์ ๊ฒ์ฌ)
// + ๊ฐ๋ฅ ์ฌ๋ถ๋ง ์ฐพ์ผ๋ฉด ๋๋๊น
if (i == n)
{
OutputSolution(i);
Exit(); // ๋์ถฉ ๋๋๋ ํจ์
}
// ๋ง์ง๋ง ๋ ๋ฒจ์ด ์๋๋ฉด
// ์์ ๋
ธ๋๋ค์ ๋ํด์ ๊ฒ์ฌ
else
{
for (int c = 1; c <= k; c++)
{
color[i + 1] = c;
ColoringBT(i + 1);
}
}
}
bool Promising(int i)
{
// ์ ๋งํ์ง ์์ ๊ฒฝ์ฐ
// 1. ์ธ์ ํ๊ณ : graph[i][j]
// 2. ์์ด๊ฐ์ : color[i] == color[j]
for (int j = 0; j < i; j++)
{
if (graph[i][j] && color[i] == color[j])
return false;
}
return true;
}
๐ซง ๋ถ์
์ํ ๊ณต๊ฐ ํธ๋ฆฌ์ ๋ ธ๋ ์
\[1 + k + k^2 + ... + k^n = {(k^{n+1} - 1) \over (n-1)}\]๊ฒฐ์ ๋ฌธ์ ์ด๊ณ ํจ์จ์ ๊ฐ์ง์น๊ธฐ๊ฐ ์ด๋ฃจ์ด์ง๋ฏ๋ก, ์๊ฐ ๋ณต์ก๋๋ ํฌ๋๋ผ๋, ์ค์ ๋ฐฉ๋ฌธ ๋
ธ๋ ์๋ ํจ์ฌ ์ ์
์์์ 46๊ฐ๊ตญ๋ง์ ๋์ -> ์ฝ 1.3 ร 10^22
@ KGC_0001 ์์๋ ์ด 29,524๊ฐ์ ๋
ธ๋ ๊ฐ์ด๋ฐ 17๊ฐ ๋
ธ๋๋ง ๋ฐฉ๋ฌธ
@ ๊ฐ์ ๋
ธ๋ ์๋ผ๋ ์ฐ๊ฒฐ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ฉด ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ด
์ ๋งํ ๋ ธ๋ ์
- ํด๋ฐํด ์ฌ์ดํด ๋ฌธ์ ์ฒ๋ผ ์ ๋งํ ๋ ธ๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ ์ ์์
- ๊ฐ์ ๊ฐ์์ ์ ์ ์ด๋ผ ํ๋๋ผ๋ ์ ๋ ฅ ๊ทธ๋ํ์ ๋ฐ๋ผ ์ ๋งํ ๋ ธ๋์ ์๊ฐ ๋ฌ๋ผ์ง
- ์์ฃผ ๋นจ๋ฆฌ ํด๋ต์ ์ป์ ์๋ ์๊ณ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ค์ ธ์ผ ํ ์๋ ์์