Dijkstra's Algorithm

๊ทธ๋ž˜ํ”„ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ค‘์— ํ•˜๋‚˜๋กœ ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (single-source shortest path algorithmm)

์šฐ์„ ์ˆœ์œ„ ํ์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

vertex๋ฅผ ํ•œ๊ฐœ์”ฉ ์„ ํƒํ•˜๋ฉฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•.

relax์˜ ๊ฐœ๋…์„ ์ด์šฉํ•˜๋ฉฐ relax๋Š” ํ˜„์žฌ ๊ณ„์‚ฐ๋œ v๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ํ˜„์žฌ ๋…ธ๋“œ u๊นŒ์ง€์˜ ๊ฒฝ๋กœ์™€ u์—์„œ v์˜ ๊ฐ€์ค‘์น˜ ( e(u,v) ) ๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๊ฒƒ.

relax๋Š” prim ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ decrease-key์™€ ์œ ์‚ฌํ•˜๋ฉฐ dp๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฐœ๋…

ํŠน์ง•

  • ํƒ์š•์ ์ธ ๋ฐฉ๋ฒ•( Greedy Method )

  • ์ •์  ์„ ํƒ ๊ธฐ๋ฐ˜

  • ์Œ์˜ ๊ฐ€์ค‘์น˜ ํ—ˆ์šฉ x

  • ์‹œ์ž‘ ์ •์ ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์˜ ๊ฐ„์„ ์„ ๊ฐ–๋Š” ์ •์ ์„ ์„ ํƒํ•˜์—ฌ ์‹ ์žฅ ํŠธ๋ฆฌ ์ง‘ํ•ฉ์„ ๋‹จ๊ณ„์ ์œผ๋กœ ํ™•์žฅ

  • ๋ฐ€์ง‘ ๊ทธ๋ž˜ํ”„์— ์ ํ•ฉ

  • ์ž๋ฃŒ๊ตฌ์กฐ์ค‘ ํ•˜๋‚˜์ธ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€๊ฐ€ ์‹œ๊ฐ„๋ณต์žก๋„์— ์˜ํ–ฅ

Pesudo Code

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

Prim's ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ decrease key ๋ถ€๋ถ„์„ dp๋ฅผ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ ๋นผ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋‹ค.

  1. vertex๋“ค์˜ key๊ฐ’์„ Infinity๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  2. start vertex์˜ key๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (์–ด๋–ค vertex๋ฅผ ์„ ํƒํ•˜๋”๋ผ๊ณ  MST๊ฐ€ ๋‚˜์˜จ๋‹ค.)

  3. ํ˜„์žฌ vertex์— ์ธ์ ‘ํ•œ vertex๋“ค ์ค‘ ์„ ํƒํ•˜์ง€ ์•Š์•˜๊ณ , ๊ฐ€์žฅ vertex์˜ key๊ฐ’์ด ์ž‘์€ vertex์„ ์ฐพ๋Š”๋‹ค. (exract-min = ์ตœ์†Œ๊ฐ’ ์ถ”์ถœ)

  4. ํ˜„์žฌ vertex๋ฅผ ์„ ํƒํ•œ๋‹ค.

  5. ์ธ์ ‘ํ•œ vertex์ค‘ vertex์˜ key๊ฐ’๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด ๋” ์ž‘๋‹ค๋ฉด key๊ฐ’์„ ๊ฐ€์ค‘์น˜์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์œผ๋กœ ๊ฐฑ์‹  ํ•œ๋‹ค. (RELAX)

  6. ์ธ์ ‘ํ•œ vertex์ค‘ ์„ ํƒํ•˜์ง€ ์•Š์•˜๊ณ , ๊ฐ€์žฅ vertex์˜ key๊ฐ’์ด ์ž‘์€ vertex๋ฅผ ๊ธฐ์ค€์œผ๋กœ 3๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•œ๋‹ค.

  7. ๋ชจ๋“  vertex๊ฐ€ ์„ ํƒ๋˜์—ˆ๋‹ค๋ฉด ๋๋‚œ๋‹ค.

์ธ์ ‘ ํ–‰๋ ฌ


์œ„์— ์„ค๋ช…ํ•œ 3๋ฒˆ ๋ฐฉ๋ฒ•์˜ extract-min์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋งค๋ฒˆ VํšŒ ๋ฐ˜๋ณตํ•œ๋‹ค.

์•„๋ž˜๋Š” 5๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ์ ‘ํ•œ vertex์ค‘ vertex์˜ key๊ฐ’๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด ๋” ์ž‘๋‹ค๋ฉด key๊ฐ’์„ ๊ฐ€์ค‘์น˜์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์œผ๋กœ ๊ฐฑ์‹  ํ•œ๋‹ค.

์ž˜ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ Prim's ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๊ตํ•ด์„œ vertex_key[selct_idx]์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ


์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ์ ‘ํ•œ vertex์˜ ๊ฐ€์ค‘์น˜๋ฅผ priority queue๋ฅผ ํ†ตํ•ด ์ €์žฅํ•œ๋‹ค.

๋•Œ๋ฌธ์—, 3๋ฒˆ ๋ฐฉ๋ฒ•์˜ exract-min์€ ๋งจ์•ž์—์„œ pop์„ ์‹œ์ผœ ์ฐพ์•„์ฃผ๋ฉด ๋œ๋‹ค.

5๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ์ ‘ํ•œ vertex์ค‘ vertex์˜ key๊ฐ’๋ณด๋‹ค ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์™€ ํ˜„์žฌ ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด ๋” ์ž‘๋‹ค๋ฉด key๊ฐ’์„ ๊ฐ€์ค‘์น˜์™€ ํ˜„์žฌ ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์œผ๋กœ ๊ฐฑ์‹  ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ์ ‘ํ•œ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„

Prim's ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋™์ผํ•˜๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ดˆ๊ธฐํ™”ํ•˜๋Š”๋ฐ O(|V|), MST๊ณ„์‚ฐํ•˜๋Š”๋ฐ O(|V|) * T(extract-min) (๊ฐ€์žฅ ์ ์€ ๊ฐ’ ์ถ”์ถœํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ์‹œ๊ฐ„) + O(|E|) * T(RELAX) ( key๊ฐ’ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ )์™€ ๊ฐ™๋‹ค.

๋”ฐ๋ผ์„œ, priority-queue๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์ผ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๊ฒฝ์šฐ T(extract)๊ฐ€ O(|V|), T(RELAX)๋Š” O(1)๋งŒํผ ๊ฑธ๋ ค ์ด O(|V^2|)์ด ๊ฑธ๋ฆฐ๋‹ค.

binary heap(์ด์ง„ ํž™)์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด T(extract)๊ฐ€ O(lgV), T(RELAX)๋Š” O(lgV)๋งŒํผ ๊ฑธ๋ ค ์ด O(VlgV) + O(ElgV) ์ด๊ธฐ ๋•Œ๋ฌธ์— O((E+V)lgV)๋งŒํผ ๊ฑธ๋ฆฐ๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ผ๋•Œ E์˜ ์ตœ์†Œ๊ฐ’์€ V-1๋กœ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์ด |E| > |V| ์ด๋ฏ€๋กœ O(|E|lg|V|)๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

priority queue๋ฅผ ์ด์ง„ ํž™์ด ์•„๋‹Œ fibonacci heap์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด RELAX์˜ ์‹œ๊ฐ„์„ ์ข€๋” ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. RELAX์‹œ๊ฐ„์ด O(1)๋งŒํผ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— O(E+VlgV)๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. O(E) or O(VlgV) ์ธ ์ด์œ ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ์— E๋Š” O(V^2)์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ตฌํ˜„ ์ฝ”๋“œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‚ฌ์ดํด์ด์—†๋Š” ๋ฌด๋ฐฉํ–ฅ์˜ ๊ทธ๋ž˜ํ”„์ด๊ณ , ๊ฐ€์ค‘์น˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑํ•œ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์†Œ์Šค์ฝ”๋“œ c++ ( ์ ‘๊ธฐ / ํŽผ์น˜๊ธฐ )

Last updated