Skip to content

Latest commit

ย 

History

History
197 lines (127 loc) ยท 11.4 KB

graph.md

File metadata and controls

197 lines (127 loc) ยท 11.4 KB

๊ทธ๋ž˜ํ”„ ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ž‘์„ฑ์ž : ์„œ๊ทธ๋ฆผ, ์ •ํฌ์žฌ

Table of Contents

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ

์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋ž€, ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜•๋“ค์ด ์žˆ๋‹ค.

  • ๋‹จ์ผ ์ถœ๋ฐœ (single-source) ์ตœ๋‹จ ๊ฒฝ๋กœ : ์–ด๋–ค ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ๋‹จ์ผ ๋„์ฐฉ (single-destination) ์ตœ๋‹จ ๊ฒฝ๋กœ : ๋ชจ๋“  ์ •์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์–ด๋–ค ํ•˜๋‚˜์˜ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋‹ค.
    (๊ทธ๋ž˜ํ”„ ๋‚ด์˜ ๊ฐ„์„ ๋“ค์„ ๋’ค์ง‘์œผ๋ฉด ๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.)
  • ๋‹จ์ผ ์Œ (single-pair) ์ตœ๋‹จ ๊ฒฝ๋กœ : ์–ด๋–ค ์ •์  v์—์„œ v'๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ์ „์ฒด ์Œ (all-pair) ์ตœ๋‹จ ๊ฒฝ๋กœ : ๋ชจ๋“  ์ •์  ์Œ๋“ค ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ, ๋ฒจ๋งŒ-ํฌ๋“œ, ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ธฐ ์ ํ•ฉํ•œ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์Œ์ด ์•„๋‹Œ ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ๋‹จ์ผ ์ถœ๋ฐœ, ๋‹จ์ผ ๋„์ฐฉ, ๋‹จ์ผ ์Œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ
  • ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ๋‹จ์ผ ์ถœ๋ฐœ, ๋‹จ์ผ ๋„์ฐฉ, ๋‹จ์ผ ์Œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ
  • ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ „์ฒด ์Œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ
  • BFS : ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋™์ผํ•œ ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Dijkstra Algorithm)

๊ทธ๋ž˜ํ”„ G = (V, E) ์—์„œ ํŠน์ • ์ถœ๋ฐœ ์ •์ (S)์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

  1. ์ถœ๋ฐœ ๋…ธ๋“œ S๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  2. ์ถœ๋ฐœ ๋…ธ๋“œ S์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด D๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค. (D ๋ฐฐ์—ด ๊ฒ€์‚ฌ)
  4. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด D๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
  5. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ 3, 4 ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

แ„ƒแ…กแ„‹แ…ตแ†จแ„‰แ…ณแ„แ…ณแ„…แ…ก

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ โ–ถ๏ธ DijkstraTest.java

ํŠน์ง•

  • ๊ฐ ์ •์ ์„ ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์ •ํ•œ๋‹ค.
  • ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ๋“ค ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ธ ์ •์ ์„ ์ฐพ์•„ ๋ฐฉ๋ฌธํ•˜๋Š” ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.
    • ์ด ๋•Œ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ์†Œ์ธ ์ •์ ์„ ์ฐพ๋Š” ๊ณผ์ •์—์„œ PriorityQueue ๋˜๋Š” Heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐœ์„ ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋งค ์ˆœ๊ฐ„๋งˆ๋‹ค ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์˜ ์ •์ ์„ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.
  • ์ด V x V ๋ฒˆ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ O(V^2) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์ด ์žˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ๋…ธ๋“œ์˜ ํฌ๊ธฐ(V) ๋งŒํผ ์ƒ์„ฑํ•˜๊ณ  ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.
  • D ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ˆœํšŒํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ PriorityQueue ๋˜๋Š” Heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋น„์šฉ์„ O(V)์—์„œ O(log{ํž™์— ์ €์žฅํ•œ ์ •์ ์˜ ๊ฐœ์ˆ˜})๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์†Œ ํž™์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋ฉฐ, ํž™์„ ํ†ตํ•ด ๊ตฌํ˜„๋œ Priority Queue๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค. ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ถœ๋ฐœ์ ์— ๋Œ€ํ•˜์—ฌ D ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ D[S] = 0์„ ํ•ด์ค€๋‹ค. ์ด์™€ ๋™์‹œ์— ํž™์— ๋…ธ๋“œ ์ •๋ณด(๋ฒˆํ˜ธ, ๊ฑฐ๋ฆฌ : [S, 0])๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
  2. ํž™์—์„œ ๋งจ ์œ„์— ์žˆ๋Š” ๋…ธ๋“œ I๋ฅผ ๊บผ๋‚ธ๋‹ค.
  3. ๋งŒ์ผ ๊บผ๋‚ธ ๋…ธ๋“œ I์˜ ๊ฑฐ๋ฆฌ ์ •๋ณด๊ฐ€ ํ˜„์žฌ D[I]๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ผ ๊ฒƒ์ด๋ฏ€๋กœ ๋ฌด์‹œํ•œ๋‹ค.
  4. I๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, D ๋ฐฐ์—ด์ด ๊ฐฑ์‹ ๋  ๊ฒฝ์šฐ ๊ทธ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ํž™์— ๋„ฃ๋Š”๋‹ค.
    (D[J] = D[I] + W ๋กœ ๊ฐฑ์‹ ๋  ๊ฒฝ์šฐ ํž™์— ๋…ธ๋“œ J([J, D[J]])๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.)
  5. ํž™์— ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(ElogV) ์ด๋‹ค. (O(ElogE) โ†’ O(ElogVยฒ) โ†’ O(2ElogV) โ†’ O(ElogV))

๊ฐœ์„ ๋‹ค์ต์ŠคํŠธ๋ผ

๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ โ–ถ๏ธ DijkstraTest.java > class ImprovedDijkstra

๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Bellman-Ford-Moore Algorithm)

๊ทธ๋ž˜ํ”„ G = (V, E) ์—์„œ ํŠน์ • ์ถœ๋ฐœ ์ •์ (S)์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋‹ฌ๋ฆฌ, ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ„์„ ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์•„์ด๋””์–ด

  • ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„ (V, E)์—์„œ ์–ด๋–ค ์ •์  A์—์„œ ์ •์  B๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ์ตœ๋Œ€ V - 1๊ฐœ์˜ ๊ฐ„์„ ์„ ์‚ฌ์šฉํ•œ๋‹ค. (= ์‹œ์ž‘ ์ •์  A๋ฅผ ํฌํ•จํ•˜์—ฌ ์ตœ๋Œ€ V๊ฐœ์˜ ์ •์ ์„ ์ง€๋‚œ๋‹ค.)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

  1. ์ถœ๋ฐœ ๋…ธ๋“œ S๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  2. ์ถœ๋ฐœ ๋…ธ๋“œ S์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด D๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  3. ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๊ฐ„์„ ์„ ๋Œ๋ฉด์„œ ๊ฐ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด D๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
  4. 3 ๊ณผ์ •์„ (๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ - 1)๋ฒˆ, ์ฆ‰ V-1๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
  5. 3 ๊ณผ์ •์„ ํ•œ ๋ฒˆ ๋” ๋ฐ˜๋ณตํ•˜์˜€์„ ๋•Œ, ๋ฐฐ์—ด D๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด ์Œ์˜ ์‚ฌ์ดํด์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

แ„‡แ…ฆแ†ฏแ„†แ…กแ†ซแ„‘แ…ฉแ„ƒแ…ณ

๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ โ–ถ๏ธ BellmanFordTest.java

ํŠน์ง•

  • ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ„์„ ๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์Œ์˜ ์‚ฌ์ดํด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ ธ์•ผ ํ•œ๋‹ค.
  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ V - 1๋ฒˆ E๊ฐœ์˜ ๋ชจ๋“  ๊ฐ„์„ ์„ ํ™•์ธํ•œ๋‹ค.
  • ์Œ์˜ ์‚ฌ์ดํด ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•œ ๋ฒˆ ๋” (V๋ฒˆ์งธ) E๊ฐœ์˜ ๊ฐ„์„ ์„ ํ™•์ธํ•œ๋‹ค. ์ด ๋•Œ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์ด ๊ฐฑ์‹ ๋˜์—ˆ๋‹ค๋ฉด, ๊ทธ๋ž˜ํ”„ G๋Š” ์Œ์˜ ์‚ฌ์ดํด์„ ๊ฐ€์ง„๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด V x E ๋ฒˆ ์—ฐ์‚ฐํ•˜๋ฏ€๋กœ O(VE) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Floyd-Warshall Algorithm)

๊ทธ๋ž˜ํ”„ G = (V, E) ์—์„œ ๋ชจ๋“  ์ •์  ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์•„์ด๋””์–ด

  • ์–ด๋–ค ๋‘ ์ •์  ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์–ด๋–ค ๊ฒฝ์œ ์ง€(K)๋ฅผ ๊ฑฐ์น˜๊ฑฐ๋‚˜, ๊ฑฐ์น˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ฆ‰ ์ •์  A์™€ ์ •์  B ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” A-B ์ด๊ฑฐ๋‚˜ A-K-B ์ด๋‹ค.
  • ๋งŒ์•ฝ ๊ฒฝ์œ ์ง€(K)๋ฅผ ๊ฑฐ์นœ๋‹ค๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ด๋ฃจ๋Š” ๋ถ€๋ถ„ ๊ฒฝ๋กœ ์—ญ์‹œ ์ตœ๋‹จ ๊ฒฝ๋กœ์ด๋‹ค. ์ฆ‰ A-B์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ A-K-B๋ผ๋ฉด A-K์™€ K-B๋„ ๊ฐ๊ฐ ์ตœ๋‹จ ๊ฒฝ๋กœ์ด๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

  1. ๊ฐ ๋…ธ๋“œ๋“ค ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด D๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  2. ๊ฐ ๋…ธ๋“œ๊ฐ€ ๊ฒฝ์œ ์ง€ K๋ฅผ ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐฐ์—ด D๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
  3. ๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉฐ, ์ ํ™”์‹์€ D[A][B] = min(D[A][B], D[A][K] + D[K][B] ์ด๋‹ค.

แ„‘แ…ณแ†ฏแ„…แ…ฉแ„‹แ…ตแ„ƒแ…ณแ„‹แ…ฏแ„‰แ…งแ†ฏ

ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ โ–ถ๏ธ FloydWarshallTest.java

ํŠน์ง•

  • ์‚ฌ์ดํด์ด ์—†๋‹ค๋ฉด ์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ ธ๋„ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.
  • ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์œ ์ง€์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ์ •์  -> ๋ชจ๋“  ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๋ฏ€๋กœ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” V^3์ด๊ณ , ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(V^3) ์ด๋‹ค.

๋ถ„๋ฆฌ ์ง‘ํ•ฉ(Union Find)๊ณผ ํฌ๋ฃจ์Šค์นผ(Kruskal) ์•Œ๊ณ ๋ฆฌ์ฆ˜

์Šคํ„ฐ๋”” ์ž๋ฃŒ - ์ž‘์„ฑ์ž ์ •ํฌ์žฌ | Union Find & Kruskal Algorithm

์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint Set)๊ณผ Union-Find

์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint Set)์€ ๊ต์ง‘ํ•ฉ์ด ์—†๋Š”, ์ฆ‰ ๊ณตํ†ต๋˜๋Š” ์›์†Œ๊ฐ€ ์—†๋Š” ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค. Union-Find๋Š” ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์˜ ์ •๋ณด๋ฅผ ํ™•์ธ(Find)ํ•˜๊ณ  ์กฐ์ž‘(Union)ํ•œ๋‹ค. Union Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ ๋‚ด์— ์†ํ•ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Union Find ๊ตฌํ˜„

์ดˆ๊ธฐํ™” (initialize)

root ๋ฐฐ์—ด์— i ์›์†Œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค. i ์›์†Œ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ๋ผ๋ฉด, ์ž๊ธฐ ์ž์‹ ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค.

void initialize() {
    for (int i = 1; i <= N; i++) {
        root[i] = i;
    }
}

n๋ฒˆ ๋…ธ๋“œ์˜ root ๋…ธ๋“œ ๋ฒˆํ˜ธ ์ฐพ๊ธฐ (find)

int find(int n) {
    if (root[n] == n) return n;
    return root[n] = find(root[n]);
}

a ๋…ธ๋“œ์™€ b ๋…ธ๋“œ๋ฅผ ๊ฐ™์€ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ๊ธฐ (merge, union)

void merge(int a, int b) {
    root[find(b)] = find(a);
}

Union Find๋ฅผ ํ™œ์šฉํ•œ MST ์ฐพ๊ธฐ - Kruskal Algorithm

๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„ G๊ฐ€ ์ˆœํ™˜์ด ์—†๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์ด๋ฉด ๊ทธ๋ž˜ํ”„ G๋Š” ํŠธ๋ฆฌ(Tree)์ด๋‹ค.

์‹ ์žฅ ํŠธ๋ฆฌ (Spanning Tree)๋ž€ ๋ฌดํ–ฅ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ G์˜ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„์ด๋ฉฐ, G์˜ ๋ชจ๋“  ์ •์ ์„ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ(Tree)์ธ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (Minimum Spanning Tree, MST)๋ž€ ๋ฌดํ–ฅ ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ G์—์„œ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ์‹ ์žฅ ํŠธ๋ฆฌ์ด๋‹ค. ์ด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ MST๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ๊ทธ ์ค‘ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ๋Š๋ฆฌ๊ณ  ์ž˜ ์•ˆ ์“ฐ์ด๋ฏ€๋กœ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ๋‹ค. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Union-Find๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Kruskal Algorithm ๊ตฌํ˜„

  1. (Cost, A, B) ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ชจ๋“  ๊ฐ„์„ ๋“ค์˜ ์ •๋ณด๋ฅผ Priority Queue์— ์ €์žฅํ•œ๋‹ค. (์ตœ์†Œ ํž™)
  2. Priority Queue์—์„œ ํ•˜๋‚˜์”ฉ popํ•˜๋ฉด์„œ ๋งŒ์•ฝ A์™€ B๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด A์™€ B๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ „์ฒด ๋น„์šฉ์— Cost๋ฅผ ๋”ํ•œ๋‹ค.
  3. ๋งŒ์ผ A์™€ B๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฌด์‹œํ•œ๋‹ค.

๊ตต์€ ๊ธ€์”จ ๋ถ€๋ถ„์„ Union-Find๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„ (E: ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜) : formula

Kruskal ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ โ–ถ๏ธ KruskalTest.java