포슀트

πŸŒ“ 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개 μ •μ μ˜ 색을 κΈ°μ–΅
인덱슀123456789
색122312113

@ 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개 λ…Έλ“œλ§Œ λ°©λ¬Έ
@ 같은 λ…Έλ“œ μˆ˜λΌλ„ μ—°κ²°λœ 방식이 λ‹€λ₯΄λ©΄ μ „ν˜€ λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜΄

μœ λ§ν•œ λ…Έλ“œ 수

  • ν•΄λ°€ν„΄ 사이클 문제처럼 μœ λ§ν•œ λ…Έλ“œ 개수λ₯Ό 계산할 수 μ—†μŒ
  • 같은 개수의 정점이라 ν•˜λ”λΌλ„ μž…λ ₯ κ·Έλž˜ν”„μ— 따라 μœ λ§ν•œ λ…Έλ“œμ˜ μˆ˜κ°€ 달라짐
  • μ•„μ£Ό 빨리 해닡을 얻을 μˆ˜λ„ 있고 μƒνƒœ 곡간 트리λ₯Ό λͺ¨λ‘ λ’€μ Έμ•Ό ν•  μˆ˜λ„ 있음
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.