ํฌ์ŠคํŠธ

๐ŸŒ“ ํ”Œ๋กœ์ด๋“œ-์›จ์…œ ์•Œ๊ณ ๋ฆฌ๋“ฌ

๐Ÿ’ซ ํ”Œ๋กœ์ด๋“œ-์›จ์…œ ์•Œ๊ณ ๋ฆฌ๋“ฌ - Floyd-Warshall Algorithm


์›Œ์…œ์ด ๋จผ์ € ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ์ด๋ฅผ ๊ฐœ์„ ํ•œ ํ”Œ๋กœ์ด๋“œ๊ฐ€ ๋” ๋„ค์ž„๋“œ์—ฌ์„œ.

  • ๋ฌธ์ œ์˜ ์ดํ•ด: ๋ชจ๋“  ์Œ ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ๋“ฌ
    • ๋ชจ๋“  ์ง€์ ๋“ค ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ ค์คŒ
    • ์œ ํ˜•
      1. ๋‹จ์ผ ์‹œ์ž‘์  ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต
        • i.e. ๋ฒจ๋จผ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ n๋ฒˆ ๋ฐ˜๋ณต: ฦŸ(n^2 e), ๊ณ ๋ฐ€๋„ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ ฦŸ(n^4)
      2. ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ๋“ฌ(Floyd-Warshall algorithm)
        • ์Œ์˜ ๊ฐ€์ค‘์น˜ ๊ฐ„์„ ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ์Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ฦŸ(n^3)์— ์ฐพ์Œ
        • ์Œ์˜ ์‚ฌ์ดํด์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ
        • ๊ธฐ๋ณธ ์•„์ด๋””์–ด
          • ์ •์  V={1, 2, โ€ฆ, n}๊ณผ ๊ฐ„์„  E๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ A์™€ B ๋‘ ์ •์ ๊ฐ„ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด
          • = ์ •์  {1, 2, โ€ฆ, n}์— ์†ํ•œ ์ •์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด
          • โ‰ค ์ •์  {1, 2, โ€ฆ, n-1}์— ์†ํ•œ ์ •์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด (์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ n์„ ๊ฑฐ์น˜๋ฉด ๊ฐ™๊ณ , Like ๋ฐฐ๋‚ญ๋ฌธ์ œ)
          • โ€ฆ
          • โ‰ค ์ •์  {1, 2, โ€ฆ, k}์— ์†ํ•œ ์ •์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด
          • โ€ฆ
          • โ‰ค ์ •์  {1}์— ์†ํ•œ ์ •์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด
          • โ‰ค ์ •์  { }์— ์†ํ•œ ์ •์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด(์•„๋ฌด ์ •์ ๋„ ๊ฑฐ์น˜์ง€ ์•Š์Œ)
          • ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํฌ๊ณ  ์ ์  ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ ธ์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์ž‘์Œ ๐Ÿกบ ๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๋กœ๋ถ€ํ„ฐ ์ ์  ํฐ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด!!

๋ชจ๋“  ์Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š”, ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ๋ชฐ๋ผ๋„, ๋‹จ์ผ ์‹œ์ž‘์  ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์‹œ์ž‘์ ์„ ๋‹ค๋ฅด๊ฒŒ n๋ฒˆ ๋ฐ˜๋ณต ์‹œ์ผœ ํ’€ ์ˆ˜๋Š” ์žˆ๋‹ค. (n^4)
๊ทธ๋Ÿฐ๋ฐ ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์“ฐ๋ฉด n^3์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ๋“ฌ.. ๋งŽ์ด ์•Œ์•„์•ผ๊ฒ ์ง€?

  • ๋ฌธ์ œ์˜ ์ˆœํ™˜์  ์ •์˜
    • ์ตœ์ข… ๋ชฉํ‘œ: ๋ชจ๋“  ์ •์ ๋“ค ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ
    • ์ตœ์šฐ์„  ๋ชฉํ‘œ: ๋ชจ๋“  ์ •์ ๋“ค ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด
      • ์ •์  i์—์„œ ์ •์  j๊นŒ์ง€(iโˆผ>j) ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด
      • = ์ •์  {1, 2, โ€ฆ, n}์— ์†ํ•œ ์ •์ ๋“ค๋งŒ ๊ฑฐ์น˜๋Š” iโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด Dn(i, j)
      • = ๋‹ค์Œ ๋‘ ์ตœ๋‹จ ๊ฒฝ๋กœ ์ค‘ ๋” ์งง์€ ๊ฒฝ๋กœ
        1. ์ •์  n์„ ์•ˆ๊ฑฐ์น˜๋Š”/์•ˆ์“ฐ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
        • ์ •์  {1, 2, โ€ฆ, n-1}์— ์†ํ•œ ์ •์ ๋“ค๋งŒ ๊ฑฐ์น˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
        • โ†’ Dn-1(i, j)
          1. ์ •์  n์„ ๊ฑฐ์น˜๋Š”/์“ฐ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
        • ์ •์  i์—์„œ ์ •์  n์„ ๊ฑฐ์ณ ์ •์  j์— ๋„๋‹ฌํ•˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ, i ~> n ~> j
        • iโˆผ>n๋„ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๊ณ  nโˆผ>j๋„ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ Dn(i, n) + Dn(n, j)
        • ์ด๋•Œ, iโˆผ>n์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์ค‘๊ฐ„์— ์ •์  n์„ ๊ฑฐ์น˜์ง€ ์•Š์Œ (์ •์  ์ˆ˜ : n-1)
        • ์ด๋•Œ, nโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์ค‘๊ฐ„์— ์ •์  n์„ ๊ฑฐ์น˜์ง€ ์•Š์Œ (์ •์  ์ˆ˜ : n-1)
        • โ†’ Dn(i, n) + Dn(n, j) = Dn-1(i, n) + Dn-1(n, j)
    • ์ผ๋ฐ˜ํ™”
      • ์ •์  {1, 2, โ€ฆ, k}์— ์†ํ•œ ์ •์ ๋งŒ ๊ฑฐ์น˜๋Š” iโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด Dk(i, j)
      • = ๋‹ค์Œ ๋‘ ์ตœ๋‹จ ๊ฒฝ๋กœ ์ค‘ ๋” ์งง์€ ๊ฒฝ๋กœ
        1. ์ •์  k๋ฅผ ์•ˆ๊ฑฐ์น˜๋Š”/์•ˆ์“ฐ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
        • ์ •์  {1, 2, โ€ฆ, k-1}์— ์†ํ•œ ์ •์ ๋“ค๋งŒ ๊ฑฐ์น˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
        • โ†’ Dk-1(i, j)
          1. ์ •์  k๋ฅผ ๊ฑฐ์น˜๋Š”/์“ฐ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ
        • i -{(1, 2, โ€ฆ, k-1)์— ์†ํ•œ ์ •์ }โ†’ k -{(1, 2, โ€ฆ, k-1)์— ์†ํ•œ ์ •์ }โ†’ j
        • iโˆผ>kโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ
        • iโˆผ>k์™€ kโˆผ>j๋„ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ด์•ผ ํ•จ: Dk(i, k) + Dk(k, j)
        • ์ด๋•Œ, iโˆผ>k์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์ค‘๊ฐ„์— ์ •์  k๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์Œ (์ •์  ์ˆ˜ : k-1)
        • ์ด๋•Œ, kโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์ค‘๊ฐ„์— ์ •์  k๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์Œ (์ •์  ์ˆ˜ : k-1)
        • ๐Ÿกบ Dk(i, k) + Dk(k, j) = Dk-1(i, k) + Dk-1(k, j)

Dn(i, j)๋Š” D(n, i, j)๋กœ ์จ๋„ ๋˜๊ธดํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด 3์ฐจ์› ๋ฐฐ์—ด์„ ์จ์•ผํ•˜๊ณ , 3์ฐจ์› ๋ฐฐ์—ด์€ ๋‹ค๋ฃจ๊ธฐ ๋ณต์žกํ•˜๋‹ˆ๊นŒ
์ƒ๋Œ€์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์šด 2์ฐจ์› ๋ฐฐ์—ด์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด ์“ฐ๋Š” ์‹์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด n์„ ์•„๋ž˜์ฒจ์ž๋กœ ์“ด๋‹ค.
Like ๋ฐฐ๋‚ญ ๋ฌธ์ œ

Dn(i, j) = Min { Dn-1(i, j), Dn-1(i, n) + Dn-1(n, j) }

Dn(i, j) =
if (k > 0) Min { Dn-1(i, j), Dn-1(i, n) + Dn-1(n, j) }
if (k == 0) (i, j)์˜ ๊ฐ€์ค‘์น˜

์ผ๋ฐ˜ํ™”์‹œํ‚ค๋ฉด
Dk(i, j) = Min { Dk-1(i, j), Dk-1(i, k) + Dk-1(k, j) }

๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ๋งŒ๋“ ๋‹ค = ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค

  • ๋™์  ๊ณ„ํš๋ฒ•
    • ์ตœ์šฐ์„  ๋ชฉํ‘œ: ์ •์  {1, โ€ฆ, n}์— ์†ํ•œ ์ •์ ๋งŒ ๊ฑฐ์น˜๋Š” iโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด Dn(i, j)
    • 2์ฐจ์› ๋ฐฐ์—ด์˜ ์›์†Œ Dk[i][j]์— Dk(i, j)์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์žฌ์‚ฌ์šฉ
    • ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๋Š” ๋น„์šฉ ์ธ์ ‘ ํ–‰๋ ฌ W์— ์ €์žฅ
    • ์ค‘๊ฐ„์— ์•„๋ฌด ์ •์ ๋„ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด D0์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ฐจ๋ก€๋กœ ๋ฐฐ์—ด D1, D2, โ€ฆ, Dn์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นจ(๋ฐฐ์—ด D0์€ ์ธ์ ‘ ํ–‰๋ ฌ W ์™€ ๋™์ผ)
    • ๋ฐฐ์—ด Dk์—๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ธธ์ด๋งŒ ์ €์žฅ ๐Ÿกบ ์ตœ์ข… ๋ชฉํ‘œ์ธ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์–ตํ•  ๋ฐฐ์—ด์ด ํ•„์š”
      • Dk[i][j]๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด k๋ฅผ ๋ฐฐ์—ด Vk[i][j]์— ์ €์žฅ. ์ฆ‰ iโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ k๋ฅผ ๊ฒฝ์œ ํ•œ๋‹ค๋ฉด Vk[i][j]= k๋กœ ์ง€์ •
      • Vn[i][j]๋ถ€ํ„ฐ ๊ฑฐ๊พธ๋กœ ์กฐ์‚ฌํ•ด ๋‚ด๋ ค๊ฐ€๋ฉด iโˆผ>j์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์–ด๋–ค ์ •์ ๋“ค์„ ๊ฒฝ์œ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ

Dk[i][j] =
if (k > 0) Min { Dk-1[i][j], Dk-1[i][k] + Dk-1[i][k] }
if (k == 0) [i][j]์˜ ๊ฐ€์ค‘์น˜

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋งŒ ์‚ฌ์šฉํ•ด์„œ ๊ณ„์† ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋ฐ˜๋ณต
    • ์ž„์˜์˜ Dk[i][j]๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” Dk-1[i][k]๋Š” Dk[i][k]์™€ ๊ฐ™๊ณ  Dk-1[k][j]๋Š” Dk[k][j]์™€ ๊ฐ™์œผ๋ฏ€๋กœ ์ด ๋‘ ๊ฐ’์€ Dk๋ฅผ ๊ตฌํ•˜๋Š” k ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ๋Š” ์ ˆ๋Œ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
    • Dk์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ๊ณ ํ•˜๋Š” ๊ฐ’์€ Dk-1[k][?] ๋‚˜ Dk-1[?][k], Dk-1์˜ kํ–‰๊ณผ k์—ด์˜ ์š”์†Œ๋“ค ๋ฟ
    • ๋ณต์žก๋„: ฦŸ(n3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void FloydWarshallDP(int d[][MAX], int n)
{
	int V[MAX][MAX] = {0};
	for (int k = 1; k <= n; k++) // ๊ฐ ์ •์ ์— ๋Œ€ํ•ด : n
		for (int i = 1; i <= n; i++) // ํ–‰ : n
			for (int j = 1; j <= n; j++) // ์—ด : n
				if (D[i][k] + D[k][j] < D[i][j]) // k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์œผ๋ฉด
				{
					D[i][j] = D[i][k] + D[k][j]; // ๊ฑฐ๋ฆฌ
					V[i][j] = k; // ๊ฒฝ์œ 
				}

	// ๋ณต์žก๋„ : n * n * n
}

๐Ÿ’ซ ์ดํ–‰์  ํ์‡„ ๋ฌธ์ œ


(์ถ”์ด์  ํํฌ)(transitive closure)

๐Ÿซง ์ดํ–‰์  ๊ด€๊ณ„

R์ด ์ง‘ํ•ฉ S์— ๋Œ€ํ•œ ๊ด€๊ณ„๋ผ ํ•  ๋•Œ ๋ชจ๋“  a,b,c โˆˆ S์— ๋Œ€ํ•ด (a,b)โˆˆR์ด๊ณ  (b,c)โˆˆR์ด๋ฉด (a,c)โˆˆR์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ R์„ ์ดํ–‰์  ๋˜๋Š” ์ดํ–‰์  ๊ด€๊ณ„๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿซง ์ดํ–‰์  ํ์‡„

R์ด ์ง‘ํ•ฉ S์— ๋Œ€ํ•œ ๊ด€๊ณ„๋ผ ํ•  ๋•Œ ๊ด€๊ณ„ R์„ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ดํ–‰์ ์ธ ๊ด€๊ณ„๋ฅผ R์˜ ์ดํ–‰์  ํ์‡„๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿซง _

  • ๋ฌธ์ œ: ๊ทธ๋ž˜ํ”„์˜ ๊ฐ ์ •์  ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฐ€?
    • ์ดํ–‰์  ํ์‡„ ๊ด€๊ณ„ R์„ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด
    • a์—์„œ b๋กœ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๊ณ  b์—์„œ c๋กœ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ (a, c)โˆˆR
    • โˆด ๊ด€๊ณ„์—์„œ์˜ ์ดํ–‰์  ํ์‡„๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ โ‰ก ๊ทธ๋ž˜ํ”„์˜ ์ •์ ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์กฐ์‚ฌํ•˜๋Š” ๋ฌธ์ œ
    • ๐Ÿกบ ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.