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κ° λ
Έλλ§ λ°©λ¬Έ
@ κ°μ λ
Έλ μλΌλ μ°κ²°λ λ°©μμ΄ λ€λ₯΄λ©΄ μ ν λ€λ₯Έ κ²°κ³Όκ° λμ΄
μ λ§ν λ Έλ μ
- ν΄λ°ν΄ μ¬μ΄ν΄ λ¬Έμ μ²λΌ μ λ§ν λ Έλ κ°μλ₯Ό κ³μ°ν μ μμ
- κ°μ κ°μμ μ μ μ΄λΌ νλλΌλ μ λ ₯ κ·Έλνμ λ°λΌ μ λ§ν λ Έλμ μκ° λ¬λΌμ§
- μμ£Ό 빨리 ν΄λ΅μ μ»μ μλ μκ³ μν κ³΅κ° νΈλ¦¬λ₯Ό λͺ¨λ λ€μ ΈμΌ ν μλ μμ