Computer Science/Algorithms

๐Ÿ›ฃ๏ธ Shortest Path in an Unweighted Graph

metamong 2024. 5. 23.

intro

๐Ÿ›ฃ๏ธ ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ, ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ, ๋ฒจ๋งŒ-ํฌ๋“œ์™€ ๊ฐ™์€ ์œ ๋ช…ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ TOP 3 ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•˜๋Š”๋ฐ, ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์ „ํ˜€ ์—†๋Š”, ์ฃผ์–ด์ง„ ์ผ๋ฐ˜์ ์ธ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ BFS๊ฐ€ best. ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์—์„œ BFS๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ์™€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋‚ด์šฉ ์ถœ๋ ฅ๊นŒ์ง€ ์•Œ์•„๋ณธ๋‹ค.

DFS๋Š” ์•ˆ๋˜๊ณ  BFS๋Š” ๊ฐ€๋Šฅํ•œ ์ด์œ ?

๐Ÿ›ฃ๏ธ ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ์˜ ๋Œ€ํ‘œ์ ์ธ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” DFS, BFS๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ shortest path in an unweighted graph๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” DFS๋ณด๋‹ค๋Š” BFS ๋ฐฉ์‹์„ ์ ๊ทน ๊ถŒ์žฅ. ์ ‘๊ทผ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

: BFS์˜ ๊ฒฝ์šฐ level-wise exploration ํ˜•ํƒœ๋กœ ๊ทธ๋ž˜ํ”„ ๋ ˆ๋ฒจ๋ณ„๋กœ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค. ์ฆ‰, ์‹œ์ž‘๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ d ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” (d+1) ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ๊ทธ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ์— ์•ž์„œ์„œ ๋ชจ๋‘ ํƒ์ƒ‰๋˜๊ธฐ ๋•Œ๋ฌธ. ์ฆ‰, BFS๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ•œ ๋…ธ๋“œ์— ๋„๋‹ฌํ•  ๋•Œ, ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€์˜ ๋„๋‹ฌ shortest path๋ฅผ ๊ตฌํ•œ ์…ˆ. ์ถ”๊ฐ€๋กœ BFS๋Š” queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋จผ์ € ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” path๋Š” shortestํ•˜๋‹ค๋Š” ์ ๋„ guarantee๋จ.

 

: ๋ฐ˜๋ฉด์— DFS์˜ ๊ฒฝ์šฐ depth-wise exploration ๋ฐฉ์‹์œผ๋กœ ๋จผ์ € ๋”ฅํ•˜๊ฒŒ ๋‚˜์ค‘์˜ traversal process์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” shorter path๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

BFS์˜ depth๊ฐ€ ๊ณง ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋‹ค

๐Ÿ›ฃ๏ธ node A์˜ BFS์˜ depth๋Š” ๊ณง starting node๋ถ€ํ„ฐ node A๊นŒ์ง€์˜ edges(๊ฐ„์„ ) ๊ฐœ์ˆ˜์ด๋‹ค. (์•„๋ž˜ ๊ทธ๋ฆผ ์ฐธ์กฐ)

: ์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด node D์˜ depth๋Š” starting node A๋ถ€ํ„ฐ node D๊นŒ์ง€์˜ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋กœ, 2์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (source node๋ฅผ level 0 ๊ฐ€์ •)

 

๐Ÿ›ฃ๏ธ ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น node D์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ(starting node A๋ถ€ํ„ฐ ์‹œ์ž‘)๋Š” 2์ž„์„ ์–ด๋–ป๊ฒŒ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์•„๋ž˜ ๋ช…์ œ๋ฅผ ๋จผ์ € ์ฆ๋ช…ํ•ด๋ณด์ž

 

" ๊ฐ„์„  (U,V)๋ฅผ ํ†ตํ•ด์„œ ์ •์  V๋ฅผ ์ฒ˜์Œ ๋ฐœ๊ฒฌํ•ด queue์— ๋„ฃ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •. ์ด ๋•Œ ์‹œ์ž‘์ (source node S)์—์„œ ์ •์  V๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ dist(S,V)๋Š” ์‹œ์ž‘์ ์—์„œ ์ •์  U๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ dist(S,U) + 1์ด๋‹ค" → "dist(S,V) = dist(S,U) + 1"

 

โ‘  dist(S,V) > dist(S,U) + 1

: ์ž๋ช…ํ•˜๋‹ค. S์—์„œ U๊นŒ์ง€์˜ ๊ฒฝ๋กœ์—์„œ ๊ฐ„์„  (U,V)๋กœ 1๊ฐœ๋ฅผ ๋” ๋ถ™์ด๋ฉด dist(S,V)๊ฐ€ dist(S,U) + 1์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

โ‘ก dist(S,V) < dist(S,U) + 1

: V๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ U ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ + 1๋ณด๋‹ค ์งง๋‹ค๊ณ  ๊ฐ€์ •. ๊ทธ๋ ‡๋‹ค๋ฉด ์งง๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ํ•ด๋‹น ๊ฒฝ๋กœ ์ƒ์—์„œ V ๋…ธ๋“œ ๋ฐ”๋กœ ์ด์ „์˜ ์ •์ ์€ ๋‹น์—ฐํžˆ U๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค. V ๋…ธ๋“œ ๋ฐ”๋กœ ์ด์ „์˜ ์ •์ ์„ P๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, dist(S,P) = dist(S,V) - 1์ด๋ฏ€๋กœ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ€๋“ฑ์‹์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

dist(S,V) < dist(S,U) + 1 & dist(S,P) = dist(S,V) - 1 ↔ dist(S,P) < dist(S,U) + 1 - 1 = dist(S,U)

 

๋”ฐ๋ผ์„œ, dist(S,P) < dist(S,U)์™€ ๊ฐ™์€ ์‹์ด ์™„์„ฑ๋œ๋‹ค. ์ฆ‰ ํ•ด๋‹น ์‹์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” BFS ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ƒ ๋…ธ๋“œ P๋ฅผ ๋…ธ๋“œ U๋ณด๋‹ค ์šฐ์„  ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ๋…ธ๋“œ P๋Š” ๋…ธ๋“œ V ๋ฐ”๋กœ ์ด์ „์˜ ์ •์ ์œผ๋กœ, ์ข…ํ•ฉํ•˜๋ฉด ๋…ธ๋“œ P๋ฅผ ๋ฐฉ๋ฌธ ํ›„ ๋…ธ๋“œ V๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋…ธ๋“œ U๋ณด๋‹ค ๋…ธ๋“œ P๋ฅผ ์šฐ์„  ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ๋„์ถœํ–ˆ์œผ๋ฏ€๋กœ (1) ๋…ธ๋“œ U๋Š” ๋…ธ๋“œ V์™€ ๊ฐ™์€ ๋ ˆ๋ฒจ(depth)์— ์žˆ๊ฑฐ๋‚˜, (2) ๋…ธ๋“œ V ๋ฐฉ๋ฌธ ํ›„ ๋…ธ๋“œ U๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋‘ ์ผ€์ด์Šค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„์„  (U,V)๋ฅผ ํ†ตํ•ด ์œ„ (1)๊ณผ (2)๋Š” ๋ชจ๋‘ ๋ชจ์ˆœ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ท€๋ฅ˜๋ฒ•์— ์˜ํ•ด โ‘ก๋„ False.

 

→ ๋”ฐ๋ผ์„œ, ๊ฐ„์„  (U,V)๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด dist(S,V)๋Š” dist(S,U) + 1์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (dist(X,Y) = ์ •์  X์—์„œ ์ •์  Y๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ)

 

๐Ÿ›ฃ๏ธ ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ A์—์„œ ๋…ธ๋“œ D๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋…ธ๋“œ A์—์„œ ์‹œ์ž‘ํ•ด BFS๋ฅผ ํƒ์ƒ‰ํ•ด ๋…ธ๋“œ D๊นŒ์ง€์˜ depth๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ(๋…ธ๋“œ A์˜ depth 0 ๊ฐ€์ •)

Shortest Path BFS code

๐Ÿ›ฃ๏ธ ์•„์ด๋””์–ด:

(1) ์›๋ž˜์˜ BFS ์ฝ”๋“œ์—์„œ ๊ฐ ๋…ธ๋“œ๋ณ„(1๋ฒˆ ๋…ธ๋“œ ~ N๋ฒˆ ๋ณด๋“œ) depth๊ฐ€ ์ €์žฅ๋œ 1์ฐจ์› list ๋งŒ๋“ค๊ธฐ(-1๋กœ ์ฒ˜์Œ์— ๋ชจ๋‘ ์ดˆ๊ธฐํ™”)

(2) ์‹œ์ž‘ ๋…ธ๋“œ depth 0 ์„ค์ •

(3) queue ๋Œ๋ฉด์„œ popleft()๋กœ ๋บ€ ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ for๋ฌธ ์ค‘ ํŠน์ • ๋…ธ๋“œ ์ฒซ ๋ฐฉ๋ฌธ ์‹œ, ์›๋ž˜ ๋…ธ๋“œ depth์— 1์„ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ depth์— ์ €์žฅ

(4) ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ•œ depths list์—์„œ ๋„์ฐฉ ๋…ธ๋“œ์—์„œ์˜ depth ์ถœ๋ ฅํ•˜๋ฉด ์‹œ์ž‘์ ์—์„œ ๋„์ฐฉ์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ถœ๋ ฅ

Shortest Path ๋‚ด์šฉ & ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

โ‘  Shortest Path ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋…ธ๋“œ ๋ฒˆํ˜ธ ๊ตฌํ•˜๊ธฐ

: ๋‹จ์ˆœํžˆ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋ช‡์ธ์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ๋‚ด์šฉ(๋…ธ๋“œ ๋ฒˆํ˜ธ)์„ ๋ฌผ์–ด๋ณด๋Š” ์œ ํ˜•๋„ ์กด์žฌ. path list๋ฅผ ๋งŒ๋“  ๋’ค(A), A[3]์€ 3๋ฒˆ node๋ฅผ ์ž์‹ node๋กœ ํ•˜๋Š” ๋ถ€๋ชจ node ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅ. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ BFS๋กœ ํƒ์ƒ‰ํ•œ๋‹ค๋ฉด,

ex) 1๋ฒˆ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋Š” 2์ด๋ฏ€๋กœ path[1] = 2, 2๋ฒˆ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋ฒˆํ˜ธ ๋…ธ๋“œ๋Š” 3์ด๋ฏ€๋กœ path[2] = 3 ~ ์ด๋ ‡๊ฒŒ ์ง„ํ–‰๋œ๋‹ค. ์‹œ์ž‘ node์˜ ๋ถ€๋ชจ ๋ฒˆํ˜ธ node๋Š” 0์œผ๋กœ ์„ค์ •(path[5] = 0). ๋”ฐ๋ผ์„œ ๋„์ฐฉ์ ์—์„œ์˜ node๋ถ€ํ„ฐ ์—ญ์ถ”์ ์œผ๋กœ path list๋ฅผ ์ง„ํ–‰ํ•ด path[5] = 0 ๊ฒฐ๋ก ์ด ๋  ๋•Œ๊นŒ์ง€ ์—ญ์ถ”์  ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ‘ก Shortest Path ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

ex) 1์—์„œ 6๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž. ์ด ๋•Œ parent node๋ฅผ v๋ผ ํ•˜๋ฉด ๋ป—์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋Š” v-1, v+1, 2*v ์„ธ ๊ฐ€์ง“์ˆ˜.

(1) ์ฃผ์–ด์ง„ ์ˆซ์ž ๋ฒ”์œ„ ์•„๋‹Œ child node ์ œ์™ธ(๋…ธ๋ž€์ƒ‰ X)

 

(2) ex) ํ˜„์žฌ node์—์„œ v-1, v+1, 2*v๋กœ ๋ป—์—ˆ์„ ๋•Œ(BFS ํƒ์ƒ‰)

โ‘  child node๊ฐ€ ๋ชฉํ‘œ node๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

[1] child node๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด node (์œ„ ๊ทธ๋ฆผ ๋ณด๋ผ์ƒ‰) : depths update, visited True ์„ค์ •, queue์— ๋„ฃ๊ธฐ

 

[2] child node๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ node(ex ์œ„์˜ ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ depth 1์—์„œ 2๋กœ ๋ป—์„ ๋•Œ node number 2) (์œ„ ๊ทธ๋ฆผ ์ดˆ๋ก์ƒ‰) : ๋™์ผํ•œ number์˜ node๋Š” ๋™์ผ depth์— ์žˆ์„ ๋•Œ๋งŒ ์ดํ›„ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•˜๊ณ , ์ด๋ฏธ ์ด์ „ depth์— ์กด์žฌํ•œ๋‹ค๋ฉด pass

→ ๋”ฐ๋ผ์„œ depths[child] == depths[v] + 1์ผ ๊ฒฝ์šฐ๋งŒ depths update, queue์— ๋„ฃ๊ธฐ

 

โ‘ก child node๊ฐ€ ๋ชฉํ‘œ node์ธ ๊ฒฝ์šฐ

[1] ์ฒซ ๋ชฉํ‘œ node ๋„๋‹ฌ์ด๋ผ๋ฉด(found == False) (์œ„ ๊ทธ๋ฆผ ๋นจ๊ฐ„์ƒ‰): depths update, visited True ์„ค์ •, queue์— ๋„ฃ๊ธฐ, found = True, found_depth ์„ค์ •, cnt(์ •๋‹ต๋ณ€์ˆ˜) += 1

 

[2] ์ด๋ฏธ ๋„๋‹ฌํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด (์œ„ ๊ทธ๋ฆผ ๋…ธ๋ž€์ƒ‰): found_depth == depths[v] + 1์ผ ๊ฒฝ์šฐ๋งŒ cnt += 1

 

+ return ์ข…๋ฃŒ ์ฝ”๋“œ ๋„ฃ๊ธฐ +

 

โ‘  child node๊ฐ€ ๋ชฉํ‘œ node๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

[1] child node๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด node์ธ ๊ฒฝ์šฐ(์œ„ ๊ทธ๋ฆผ ๋ณด๋ผ์ƒ‰)

: if found ๋‹ต ์ฐพ์•˜๋‹ค๋ฉด → found_depth๋ณด๋‹ค ํ˜„์žฌ depth[child]๊ฐ€ ๋” ํฌ๋‹ค๋ฉด, return ์ข…๋ฃŒ(๊ทธ ๋‹ค์Œ depth๋กœ ์ง„ํ–‰๋œ ๊ฒƒ์ด๋ฏ€๋กœ)

 

[2] child node๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ node์ธ ๊ฒฝ์šฐ(์œ„ ๊ทธ๋ฆผ ์ดˆ๋ก์ƒ‰)

: ๋™์ผํ•œ number์˜ node๊ฐ€ ๋™์ผ depth์— ์žˆ์„ ๊ฒฝ์šฐ → if found ๋‹ต ์ฐพ์•˜๋‹ค๋ฉด → found_depth๋ณด๋‹ค ํ˜„์žฌ depth[child]๊ฐ€ ๋” ํฌ๋‹ค๋ฉด, return ์ข…๋ฃŒ(๊ทธ ๋‹ค์Œ depth๋กœ ์ง„ํ–‰๋œ ๊ฒƒ์ด๋ฏ€๋กœ)

 

โ‘ก child node๊ฐ€ ๋ชฉํ‘œ node์ธ ๊ฒฝ์šฐ

[1] ์ฒ˜์Œ์œผ๋กœ ๋„๋‹ฌ(์œ„ ๊ทธ๋ฆผ ๋นจ๊ฐ„์ƒ‰)

: return x

 

[2] ์ด๋ฏธ ๋„๋‹ฌํ•œ ์  ์žˆ๋Š” ๊ฒฝ์šฐ(์œ„ ๊ทธ๋ฆผ ๋…ธ๋ž€์ƒ‰)

: ์ด๋ฏธ ์ฐพ์€ found_depth์™€ ํ˜„์žฌ depth(depths[v]+1)์™€ ์„œ๋กœ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด, return ์ข…๋ฃŒ

 

โ€ป ์ตœ๋‹จ๊ฒฝ๋กœ ๊ฐฏ์ˆ˜ ํ•ต์‹ฌ์€, found bool flag ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“  ๋’ค,

์ฒ˜์Œ์œผ๋กœ ๋„๋‹ฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(found==True)์ผ ๋•Œ ์ฒ˜์Œ์œผ๋กœ ๋„๋‹ฌํ–ˆ์„ ๋•Œ์˜ node depth(found_depth)์™€ ํ˜„์žฌ depth๋ฅผ ๋น„๊ต. ์ฆ‰ depth๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ฐฏ์ˆ˜๋ฅผ updateํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ depth๊ฐ€ found_depth๋ฅผ ๋„˜์–ด์„ฐ์œผ๋ฉด return ์ข…๋ฃŒ โ€ป

Shortest Path Exercises

examples

โ˜… <BOJ S2 16953 A → B> โ˜…

: ์ •์ˆ˜ A๋ฅผ B๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ. BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์œ ํ˜•์ž„์„ ์•Œ์•„์ฐจ๋ฆฌ๋Š” ๊ฒŒ ์ค‘์š”. 2๋ฅผ ๊ณฑํ•œ ๊ฒฝ์šฐ์™€ 1์„ ๋ถ™์ธ ๋‘ ๊ฐˆ๋ž˜๋ฅผ BFS ๋ฐฉ์‹์œผ๋กœ depth ๋ณ„๋กœ ๋ป—์–ด ๋‚˜๊ฐ€๋ฉด์„œ ์ตœ์†Œ ๊ฐ„์„ ์˜ ํšŸ์ˆ˜(์ตœ์†Œ depth)๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ฐ”๋กœ depth๋ฅผ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ ์ถœ๋ ฅ

 

โ˜… <BOJ S2 1644 ์ดŒ์ˆ˜๊ณ„์‚ฐ> โ˜…

: ๊ฐ€์กฑ์˜ ์ดŒ์ˆ˜๋Š” BFS์˜ depth์ž„์„ ์ธ์ง€ํ•˜๋ฉด ๋ฐ”๋กœ ํ’€๋ฆผ

 

โ˜… <BOJ S1 1697 ์ˆจ๋ฐ”๊ผญ์งˆ> โ˜…

: ์œ„ 16953 ๋ฌธ์ œ์™€ ๋™์ผ. X-1, X+1, 2*X ์„ธ ๊ฐˆ๋ž˜๋กœ ๊ฐ„์„  ๋ป—์–ด๋‚˜๊ฐ€๊ธฐ

 

โ˜… <BOJ S1 7562 ๋‚˜์ดํŠธ์˜ ์ด๋™> โ˜…

: ์—ญ์‹œ ๋™์ผ. ๋‚˜์ดํŠธ์˜ ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜ BFS์˜ depth๋กœ ๊ตฌํ•˜๊ธฐ

 

โ˜… <BOJ S1 5014 ์Šคํƒ€ํŠธ๋งํฌ> โ˜…

: ์—ญ์‹œ ๋™์ผ. ๋‹จ, 1์ฐจ์› ๋ฐฐ์—ด์—์„œ์˜ BFS depth ๊ตฌํ•˜๊ธฐ

 

โ˜… <BOJ S1 2178 ๋ฏธ๋กœ ํƒ์ƒ‰> โ˜…

: ์—ญ์‹œ ๋™์ผ. ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ, ์‹œ์ž‘์ ์—์„œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ

 

โ˜… <BOJ S1 16948 ๋ฐ์Šค ๋‚˜์ดํŠธ> โ˜…

: ์—ญ์‹œ ๋™์ผ. ๋‹จ, ์›€์ง์ด๋Š” ๋ฐฉํ–ฅ์ด ๋ฌด๋ ค 6๋ฐฉํ–ฅ์ธ ์ ๋งŒ ์ˆ™์ง€ํ•˜๋ฉด ๋

 

โ˜… <BOJ S1 14940 ์‰ฌ์šด ์ตœ๋‹จ๊ฑฐ๋ฆฌ> โ˜…

: ๋™์ผ. ๋‹ค๋งŒ ๊ทธ๋ž˜ํ”„์— ๋„๋‹ฌ ๋ชปํ•˜๋Š” ์ง€์ ์ด ์žˆ๋Š” ์กฐ๊ฑด ์ถ”๊ฐ€

 

โ˜… <BOJ S2 17086 ์•„๊ธฐ ์ƒ์–ด2> โ˜…

: ๋‹จ์ˆœํ•œ brute-force๋กœ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ. ํ•˜์ง€๋งŒ BFS ๊ด€์ ์œผ๋กœ ํ‘ผ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ ์ƒ์–ด์™€์˜ ์•ˆ์ „๊ฑฐ๋ฆฌ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์•„๊ธฐ ์ƒ์–ด ๊ฐ๊ฐ ์‹œ์ž‘์ ์œผ๋กœ depth update. ์ตœ์†Ÿ๊ฐ’์ด๋ฏ€๋กœ ๊ธฐ์กด depth๋ณด๋‹ค ์ž‘์„ ๋•Œ๋งŒ update. depth ๊ด€์  ์•„์ด๋””์–ด ์ƒ๊ฐํ•ด์•ผ ํ•  ๋ฌธ์ œ

 

โ˜… <BOJ G5 7576 ํ† ๋งˆํ† > โ˜…

: ์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์—์„œ ์‹œ์ž‘ํ•˜๋Š” BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ต๊ณผ์„œ ์œ ํ˜•

 

โ˜… <BOJ G5 7569 ํ† ๋งˆํ† > โ˜…

: ๋†’์ด๊นŒ์ง€ ์กด์žฌํ•˜๋Š”, 7576์˜ 3์ฐจ์› ๋ฒ„์ „. ๋ฐฉํ–ฅ๋ฒกํ„ฐ๊ฐ€ dx, dy, dz ์„ธ ๊ฐœ ์กด์žฌ. ๋ฐฉํ–ฅ์€ 6๊ฐ€์ง€ ์ฃผ์˜

 

โ˜… <BOJ G5 1240 ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ> โ˜…

: ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ณ€ํ˜• ๋ฌธ์ œ. ๊ฐ ๊ฐ„์„ ๋งˆ๋‹ค ๊ฑฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•ด์„œ, BFS๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ queue์— ๊ฐ™์ด ๋Œ๋ฆฌ๋ฉฐ depth update.

 

โ˜… <BOJ G5 13539 ์ˆจ๋ฐ”๊ผญ์งˆ 3> โ˜…

: BFS๋ฅผ ์ง„ํ–‰ํ•˜๋˜, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฐ„์„ ์ด ์žˆ๋Š” ์œ ํ˜•. ๋”ฐ๋ผ์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๊ฐ„์„  ๋ฐฉํ–ฅ ์ง„ํ–‰์„ ๋จผ์ € queue์— popleft()ํ•˜๊ณ  append()

 

โ˜… <BOJ G4 13913 ์ˆจ๋ฐ”๊ผญ์งˆ 4> โ˜…

: ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋‚ด์šฉ๊นŒ์ง€ ์—ญ์ถ”์ ํ•˜๋Š” ๋ฌธ์ œ. 

 

โ˜… <BOJ G5 16928 ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„> โ˜…

: ๋…ธ๋“œ์—์„œ ๋…ธ๋“œ๋กœ ๋‹จ์ˆจ์— ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ณ ๋ ค

 

โ˜… <BOJ G4 9019 DSLR> โ˜…

: BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์œ ํ˜•์ž„์„ ์•Œ๊ณ , queue์— ๋…ธ๋“œ๋ฒˆํ˜ธ + ํ•ด๋‹น๋…ธ๋“œ๋‚ด์šฉ ์ด๋ ‡๊ฒŒ 2๊ฐœ๋ฅผ ๋„ฃ๋Š”๋‹ค๋Š” ์ ๋งŒ ๊ธฐ์–ต

 

โ˜…<BOJ G4 1963 ์†Œ์ˆ˜๊ฒฝ๋กœ> โ˜…  

: BFS์ž„์„ ์•Œ๊ณ  ์†Œ์ˆ˜ ์„ฑ์งˆ๋งŒ ์ถ”๊ฐ€๋œ ๋ฌธ์ œ

 

โ˜…<BOJ G4 12851 ์ˆจ๋ฐ”๊ผญ์งˆ 2> โ˜…

: ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ๊ฐ€์ง“์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ(depth ํ™œ์šฉ)


geeksforgeeks

BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ depth + 1 ์ฆ๋ช…

'Computer Science > Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ“ฒ Divide&Conquer  (1) 2024.06.08
๐Ÿš€ Power by Divide and Conquer  (1) 2024.06.06
โ›† Flood Fill  (0) 2024.05.19
๐Ÿ˜๏ธEuler Sieve  (1) 2024.04.21
๐ŸฅCounting Sort  (0) 2024.04.17

๋Œ“๊ธ€