ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90

๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

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

์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” edge(๊ฐ„์„ )์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€?

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

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

- ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” edge(๊ฐ„์„ )์ด ์—†๋‹ค๋ฉด ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

- ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

 

๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋ชจ๋“  edge(๊ฐ„์„ )์„ ์ „๋ถ€ ํ™•์ธํ•˜๋ฉด์„œ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ„์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด๋‚˜๊ฐ„๋‹ค.

- ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” edge๊ฐ€ ์žˆ์–ด๋„ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

- ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

 

์ฆ‰, ๋ชจ๋“  edge์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ผ ๋•Œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„,

์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” edge๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

์ง์  ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด๋ณด์ž!

๊ทธ๋ž˜ํ”„์™€ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ‘œ(distance๋ผ๊ณ  ๋ช…๋ช…)


STEP 0.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž.

๊ทธ๋ฆฌ๊ณ , ์ถœ๋ฐœ์ง€ ๋…ธ๋“œ(์—ฌ๊ธฐ์„  '์ง‘'์„ ์ถœ๋ฐœ์ง€๋กœ ๊ฐ€์ •ํ–ˆ๋‹ค)๋กœ๋ถ€ํ„ฐ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ‘œ๋ฅผ ๋งŒ๋“ ๋‹ค.

์ด ํ‘œ๋ฅผ ์•ž์œผ๋กœ ์„ค๋ช…์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด distance๋ผ๊ณ  ํ•˜๊ฒ ๋‹ค.

์šฐ์„ ์€ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •ํ•ด ๋†“์ž. ๊ทธ๋ฆฌ๊ณ  ์ถœ๋ฐœ์ง€์˜ ๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ ๋ฐ”๊พผ๋‹ค(์ถœ๋ฐœ์ง€์—์„œ ์ถœ๋ฐœ์ง€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ 0์ด๋ฏ€๋กœ)

์ด์ œ๋ถ€ํ„ฐ (์ด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ - 1)๋งŒํผ Cycle์„ ๋Œ๋ฉด์„œ ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•„๋ณด์ž!


Cycle 1.

edge๋ฅผ ์ตœ๋Œ€ 1๊ฐœ๊นŒ์ง€ ์จ์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•ด์„œ, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค. (๋นจ๊ฐ„์ƒ‰ ๊ฐ„์„ ์ด edge 1๊ฐœ๋ฅผ ์จ์„œ ์ด๋™ํ•œ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค)

ํ˜„์žฌ ์ถœ๋ฐœ์ง€์ธ ์ง‘์—์„œ edge 1๊ฐœ๋ฅผ ์จ์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ ํ•™๊ต์™€ ๋งˆํŠธ์ด๋‹ค.

๊ฐ๊ฐ ํ•™๊ต๋Š” -1 ๋งŒํผ, ๋งˆํŠธ๋Š” 4๋งŒํผ ๊ฐ€์ค‘์น˜(๊ฑฐ๋ฆฌ)๊ฐ€ ๋“ค๊ณ , ๋ฌดํ•œ๋Œ€๋ณด๋‹ค ์ž‘์œผ๋‹ˆ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ๊ฐ๊ฐ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

edge ์ตœ๋Œ€ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ด๋™, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ต


Cycle 2.

edge๋ฅผ ์ตœ๋Œ€ 2๊ฐœ๊นŒ์ง€ ์จ์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•ด์„œ, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค.

edge ์ตœ๋Œ€ 2๊ฐœ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ด๋™, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ต


Cycle 3.

edge๋ฅผ ์ตœ๋Œ€ 3๊ฐœ๊นŒ์ง€ ์จ์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•ด์„œ, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค.

edge ์ตœ๋Œ€ 3๊ฐœ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ด๋™, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ต

Cycle 4.

edge๋ฅผ ์ตœ๋Œ€ 4๊ฐœ๊นŒ์ง€ ์จ์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•ด์„œ, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ •ํ•œ๋‹ค.

edge ์ตœ๋Œ€ 4๊ฐœ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ด๋™, ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ต

 

 


๋ฒจ๋งŒ-ํฌ๋“œ Python ์ฝ”๋“œ

 

def bellman_ford(graph, start):
    distance = dict()
    for node in graph:
        #distance[node]๋Š” ํ•ด๋‹น node๊นŒ์ง€ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’
        distance[node] = float('inf')
    distance[start] = 0
    V = len(graph) # ๋…ธ๋“œ ๊ฐœ์ˆ˜
    print("distance:",distance)
    print("------start------")
    
    for _ in range(V-1):
        # edge  ๋น„๊ต (edge์—๋Š” <์ถœ๋ฐœ ๋…ธ๋“œ, ๋„์ฐฉ ๋…ธ๋“œ, ๊ฑฐ๋ฆฌ(๊ฐ€์ค‘์น˜)>๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ dictionary์—์„œ edge ์ •๋ณด๋ฅผ for๋ฌธ์œผ๋กœ ๊บผ๋‚ด์™”๋‹ค)
         for node in graph:
            print("-------node--:", node)
            for neighbor in graph[node]:
                # ์ง€๊ธˆ๊นŒ์ง€์˜ neighbor๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ณด๋‹ค, ํ˜„์žฌ ์ •์ (node)๋ฅผ ๊ฑฐ์ณ neighbor๊นŒ์ง€ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์ž‘์„ ๊ฒฝ์šฐ
                if distance[neighbor] > distance[node] + graph[node][neighbor]:
                    distance[neighbor] = distance[node] + graph[node][neighbor]                                    
                    print("distance:",distance)

    	 print(f'{_+1}์‚ฌ์ดํด ๋\n')
    
    
    # ์Œ์ˆ˜ ์‚ฌ์ดํด ํŒ๋ณ„
    for node in graph:
        for neighbor in graph[node]:
            if distance[neighbor] > distance[node] + graph[node][neighbor]:
                return -1
            
    return distance

 

์ง„ํ–‰ ๊ณผ์ • ๋ฐ ์ถœ๋ ฅ ๊ฒฐ๊ณผ

 

distance: {'์ง‘': 0, 'ํ•™๊ต': inf, '๋งˆํŠธ': inf, '๋ฐ•๋ฌผ๊ด€': inf, '์˜ํ™”๊ด€': inf}
predecessor: {'์ง‘': None, 'ํ•™๊ต': None, '๋งˆํŠธ': None, '๋ฐ•๋ฌผ๊ด€': None, '์˜ํ™”๊ด€': None}
------start------
-------node--: ์ง‘
distance: {'์ง‘': 0, 'ํ•™๊ต': -1, '๋งˆํŠธ': inf, '๋ฐ•๋ฌผ๊ด€': inf, '์˜ํ™”๊ด€': inf}
distance: {'์ง‘': 0, 'ํ•™๊ต': -1, '๋งˆํŠธ': 4, '๋ฐ•๋ฌผ๊ด€': inf, '์˜ํ™”๊ด€': inf}
-------node--: ํ•™๊ต
distance: {'์ง‘': 0, 'ํ•™๊ต': -1, '๋งˆํŠธ': 4, '๋ฐ•๋ฌผ๊ด€': 1, '์˜ํ™”๊ด€': inf}
distance: {'์ง‘': 0, 'ํ•™๊ต': -1, '๋งˆํŠธ': 4, '๋ฐ•๋ฌผ๊ด€': 1, '์˜ํ™”๊ด€': 0}
distance: {'์ง‘': 0, 'ํ•™๊ต': -1, '๋งˆํŠธ': 2, '๋ฐ•๋ฌผ๊ด€': 1, '์˜ํ™”๊ด€': 0}
-------node--: ๋งˆํŠธ
-------node--: ๋ฐ•๋ฌผ๊ด€
distance: {'์ง‘': 0, 'ํ•™๊ต': -1, '๋งˆํŠธ': 2, '๋ฐ•๋ฌผ๊ด€': 1, '์˜ํ™”๊ด€': -2}
-------node--: ์˜ํ™”๊ด€
1์‚ฌ์ดํด ๋

-------node--: ์ง‘
-------node--: ํ•™๊ต
-------node--: ๋งˆํŠธ
-------node--: ๋ฐ•๋ฌผ๊ด€
-------node--: ์˜ํ™”๊ด€
2์‚ฌ์ดํด ๋

-------node--: ์ง‘
-------node--: ํ•™๊ต
-------node--: ๋งˆํŠธ
-------node--: ๋ฐ•๋ฌผ๊ด€
-------node--: ์˜ํ™”๊ด€
3์‚ฌ์ดํด ๋

-------node--: ์ง‘
-------node--: ํ•™๊ต
-------node--: ๋งˆํŠธ
-------node--: ๋ฐ•๋ฌผ๊ด€
-------node--: ์˜ํ™”๊ด€
4์‚ฌ์ดํด ๋

 


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

(๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ - 1) Cycle์„ ๋Œ๊ณ , ๊ฐ Cycle๋งˆ๋‹ค ๋ชจ๋“  Edge๋ฅผ ํ™•์ธํ•˜๋ฏ€๋กœ

๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ V๋ผ๊ณ  ํ•˜๊ณ , Edge์˜ ๊ฐฏ์ˆ˜๋ฅผ E๋ผ๊ณ  ํ•˜๋ฉด,

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O( |V-1|*|E| ) = O ( |V||E|) 

 

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

๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ๋งค ์ˆœ๊ฐ„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(|V|)

 

 

728x90
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ