Bellman-ford Algorithm

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

์Œ์˜ ๊ฐ€์ค‘์น˜๋„ ๊ณ„์‚ฐ ํ• ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

Vertex์˜ ๊ฐœ์ˆ˜๊ฐ€ N๊ฐœ์ผ ๋•Œ, ํ•œ vertex์—์„œ ๋‹ค๋ฅธ vertex๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๊ฑฐ์น˜๋Š” edge์ˆ˜๋Š” ์ตœ์†Œ 1๊ฐœ๋ถ€ํ„ฐ, ์ตœ๋Œ€ N-1๋ฒˆ ๊ฑฐ์น˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

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

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

ํŠน์ง•

  • ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•ด๋„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์Œ์˜ ์‚ฌ์ดํด ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ( ๋ฌดํ•œ ๋ฃจํ”„ )

  • edge ์˜ ์ •๋ณด๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด ์ธ์ ‘ํ–‰๋ ฌ, ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์•ˆ ๋งŒ๋“ค๊ณ ๋„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Pesudo Code

BELLMAN-FORD(G, w , s){
    INITIALIZE-SINGLE-SOURCE(G, s)
    for i = 1 to |G.V| - 1
        for each edge (u,v) โˆˆ G.E
            RELAX (u,v,w)

    for each edge (u,v) โˆˆ G.E
        if v.d > u.d + w(u,v)
            return false
    return true
}

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

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

  2. start vertex์˜ key๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  3. ๋ชจ๋“  edge์— ๋Œ€ํ•ด relax๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  4. 3๋ฒˆ์„ V-1๋ฒˆ ๋ฐ˜๋ณต ํ•œ๋‹ค.

  5. 4๋ฒˆ์ด ๋๋‚˜๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ๊ตฌํ•ด์กŒ์œผ๋ฉฐ, ์Œ์˜ ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒ€์‚ฌํ•œ๋‹ค.

  6. ๋ชจ๋“  edge์— ๋Œ€ํ•ด ๋ชฉ์ ์ง€ vertex์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐ’์ด ์ถœ๋ฐœ์ง€ vertex๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐ’ + w(u,v) ๋ณด๋‹ค ํฐ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

  7. ๋งŒ์•ฝ ํฌ๋‹ค๋ฉด ์Œ์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๊ณ  ๋ชจ๋“  edge์— ๋Œ€ํ•ด ์•„๋‹ˆ๋ผ๋ฉด ์Œ์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ž˜ํ”„์ด๋‹ค.

  • ์ธ์ ‘ ํ–‰๋ ฌ


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

  • edge ์ •๋ณด๋กœ ์ฃผ์–ด์กŒ์„ ๊ฒฝ์šฐ


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

์ดˆ๊ธฐํ™”ํ•˜๋Š”๋ฐ O(|V|) ์ด ์†Œ์š”๋˜๊ณ , ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ O(|E|)๋ฒˆ์˜ relax๊ฐ€ |V-1|๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, O(|V||E|)๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. (relax๋Š” ๋น„๊ตํ›„ ๋‹จ์ˆœ ๋Œ€์ž…์ด๋ฏ€๋กœ O(1)์˜ ์‹œ๊ฐ„ ์†Œ์š”)

์Œ์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋Š” ์ง€ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ |E\๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, O(|E|)๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด O(|V||E|)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

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

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

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

Last updated