๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

Depth First Search

DFS๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „๋žต์œผ๋กœ, ํ•œ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ž์‹๋…ธ๋“œ๋ฅผ ๊ณ„์† ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋” ์ด์ƒ ์ž์‹๋…ธ๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ณ  ๋” ์ด์ƒ ์ž๋…€๊ฐ€ ์—†์„ ๋•Œ๋Š” ์™”๋˜ ๊ธธ์„ ๋‹ค์‹œ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ํƒ์ƒ‰ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆœํšŒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

Algorithm Steps

DFS ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ฐ•์˜์—์„œ ์†Œ๊ฐœ๋œ ๋ฐฉ๋ฒ•์€ ์ƒ‰๊น”์„ ํ†ตํ•ด ๊ฐ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ , ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์‹œ๊ฐ„(์‹ค์ œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜์ง„ ์•Š๋Š”๋‹ค), ํƒ์ƒ‰์ด ๋๋‚œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋…ธ๋“œ๋“ค์„ ์ˆœํšŒํ•œ๋‹ค.

Node State

DFS๊ฐ€ ํƒ์ƒ‰ํ•  ๊ฐ ๋…ธ๋“œ ํ˜น์€ vertex ๋Š” ๋‹ค์Œ ์„ธ๊ฐœ ์ค‘ ํ•˜๋‚˜์˜ ์ƒ‰๊น”๋กœ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  1. White : ์•„์ง ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ
  2. Gray : ๋ฐœ๊ฒฌ์€ ๋˜์—ˆ์ง€๋งŒ ์•„์ง ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹๊ณผ ์ž์† ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ
  3. Black : ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ ๋ชจ๋“  ์ž์† ๋…ธ๋“œ๋“ค์˜ ํƒ์ƒ‰์ด ๋๋‚œ ๋…ธ๋“œ

๊ฐ€์žฅ ์ดˆ๊ธฐ์—๋Š” ๋Œ€์ƒ์ด ๋˜๋Š” ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ํฐ์ƒ‰์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Timestamp

๊ฐ ๋…ธ๋“œ๋“ค์€ ์ƒ‰๊น”๊ณผ ๋”๋ถˆ์–ด์„œ ๋‘ ์ข…๋ฅ˜์˜ timestamp๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ timestamp๋Š” ์‹ค์ œ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ์ˆœ์„œ๋ฅผ ๊ธฐ๋กํ•˜๊ฒŒ ๋œ๋‹ค.

  1. d[v] : discorvery time. ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์‹œ๊ฐ„, ์ฆ‰ color ์ƒํƒœ๊ฐ€ white ์ด์—ˆ๋‹ค๊ฐ€ gray ๊ฐ€ ๋œ ์ˆœ๊ฐ„์„ ๊ธฐ๋กํ•œ๋‹ค.
  2. f[v] : finish time. ์–ด๋–ค ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ๋“ค์˜ ํƒ์ƒ‰์ด ๋ชจ๋‘ ๋๋‚˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜จ ์‹œ๊ฐ„ ์ฆ‰ color ์ƒํƒœ๊ฐ€ gray์—์„œ black์ด ๋œ ์ˆœ๊ฐ„์„ ๊ธฐ๋กํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์–ด๋–ค ๋…ธ๋“œ v์— ๋Œ€ํ•ด์„œ d[v]๋Š” ํ•ญ์ƒ f[v] ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

Pseudo Code

DFS(V, E)
1 for each u in V
2   do color[u] = white
3 time = 0

4 for each u in V
5   do if color[u] = white
6     then DFS-VISIT(u)

์œ„ pseudo code ๋Š” DFS๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋…ธ๋“œ์ด๋‹ค. ์–ด๋–ค ๊ทธ๋ž˜ํ”„ ์•ˆ์— ๋…ธ๋“œ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŠธ๋ฆฌ๋ฅผ DFS๋กœ ๊ฐ๊ฐ ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. 1~2 ๋ฒˆ์งธ ๋ผ์ธ์—์„œ๋Š” ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ๊ทธ ์ƒ‰๊น”์„ ํฐ์ƒ‰์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  3๋ฒˆ์งธ ๋ผ์ธ์—์„œ๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋Š” time ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” timestamp๋ฅผ ๊ณ„์†ํ•ด์„œ ๊ธฐ๋กํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

4 ~ 6์งธ ๋ผ์ธ์—์„œ๋Š” ๊ฐ ๋…ธ๋“œ๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋ ค๋Š” ์‹œ๋„๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋งŒ์•ฝ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ๋‹ค ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํŠธ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ์ดํ›„์— ์ƒ‰๊น”์ด ๊ฒ€์€์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒŒ๋œ๋‹ค. ๋งŒ์•ฝ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํฐ์ƒ‰์œผ๋กœ ๋‚จ์•„์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ๋„๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

DFS-VISIT(u)
1 color[u] = gray
2 time = time + 1
3 d[u] = time

4 for each v in adj[u]
5   do if color[v] = white
6     then DFS-VISIT(v)
7 color[u] = black

8 time = time + 1
9 f[u] = time

์ด ํ•จ์ˆ˜๋Š” ์‹œ์ž‘ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ ์‹œ์ž‘์ ์ด ๋  ๋…ธ๋“œ๋ถ€ํ„ฐ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. 1 ~ 3 ๋ฒˆ์งธ ๋ผ์ธ์—์„œ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ์ƒ‰๊น”์„ gray๋กœ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ  discovery time์„ ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น๋…ธ๋“œ์˜ adjacency list, ์ฆ‰ ํ•ด๋‹น ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ณด๊ณ  ๋งŒ์•ฝ ๊ทธ ๋…ธ๋“œ๊ฐ€ ์•„์ง ๋ฐฉ๋ฌธ ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ™์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ดˆ๊ธฐ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋” ์ด์ƒ ์ž๋…€๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋…ธ๋“œ๋“ค์„ ์ฒดํฌํ•ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Example

์œ„ ์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๋งŒ์•ฝ ์ดˆ๊ธฐ ๋…ธ๋“œ๋กœ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  dfs๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด,

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘๋…ธ๋“œ๋ฅผ gray ๋กœ ์ƒ‰์น ํ•˜๊ณ  discover time์„ 1๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

์ด์ œ 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2๋ฒˆ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์„œ ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 2๋ฒˆ๋…ธ๋“œ๊ฐ€ ํฐ์ƒ‰์ด๋ฏ€๋กœ ํšŒ์ƒ‰์œผ๋กœ ์ƒ‰์น ํ•˜๊ณ , discover ์‹œ๊ฐ„์„ 1 ์˜ฌ๋ ค์„œ 2๋กœ ํ‘œ์‹œํ•ด์ค€๋‹ค.

 

 

๊ฐ™์€ ์ž‘์—…์„ ๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉด 3๋ฒˆ ๋…ธ๋“œ๋Š” ์ด์ œ ๋” ์ด์ƒ ๊ฐˆ ๊ณณ์ด ์—†์œผ๋ฏ€๋กœ black ์œผ๋กœ ์น ํ•˜๊ฒŒ ๋˜๊ณ  backtrack ์„ ํ†ตํ•ด์„œ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐ„๋‹ค.

 

 

๋ฆฌํ„ด๋œ ์ดํ›„์— 2๋ฒˆ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ž์‹๋…ธ๋“œ๊ฐ€ ์•„์ง adjacency node ๋‚จ์•„์žˆ๋Š” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— 5๋ฒˆ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ณผ์ •์„ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ทธ๋ž˜ํ”„๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

 

Algorithm Analysis

DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ์‹œ๊ฐ„ ๐›ฉ(E + V) ์˜ ์‹œ๊ฐ„๊ณผ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด adjacency list ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜๋Š” ์‹œ๊ฐ„ ๐›ฉ(E) ๋งŒํผ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ DFS์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๐›ฉ(E + V) ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.