๐Ÿ‹ โšพ๏ธ ๐Ÿ’ป ๐ŸŽฌ ๐ŸŽฎ

coding_test

[๋ฐฑ์ค€] 11657. ํƒ€์ž„๋จธ์‹  (ํŒŒ์ด์ฌ)

aeightchill 2025. 2. 27. 23:27
728x90

๐Ÿ—‚๏ธ   ๋ฌธ์ œ 

11657. ํƒ€์ž„๋จธ์‹ 


 

 


๐Ÿ“Œ   Point

Bellman-Ford Algorithm

๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹จ์ผ ์ถœ๋ฐœ์  ์ตœ๋‹จ ๊ฒฝ๋กœ(SSSP, Single Source Shortest Path)๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋‹ฌ๋ฆฌ ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํฌํ•จํ•œ ๊ทธ๋ž˜ํ”„์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

 

๊ธฐ๋ณธ ์ฝ”๋“œ

def bellman_ford(V, edges, start):
    # ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” (๋ฌดํ•œ๋Œ€)
    INF = float('inf')
    dist = [INF] * V
    dist[start] = 0  # ์‹œ์ž‘ ์ •์  ๊ฑฐ๋ฆฌ = 0

    # (V-1)๋ฒˆ ๋ชจ๋“  ๊ฐ„์„  ํ™•์ธ
    for _ in range(V - 1):
        for u, v, w in edges:
            if dist[u] != INF and dist[u] + w < dist[v]:  
                dist[v] = dist[u] + w  

    # ์Œ์ˆ˜ ์‚ฌ์ดํด ํ™•์ธ
    for u, v, w in edges:
        if dist[u] != INF and dist[u] + w < dist[v]:
            return "Negative Cycle Detected"

    return dist

# ์˜ˆ์ œ ๊ทธ๋ž˜ํ”„ (์ •์  5๊ฐœ, ๊ฐ„์„  6๊ฐœ)
V = 5
edges = [
    (0, 1, 4),
    (0, 2, 5),
    (1, 2, -2),
    (1, 3, 6),
    (2, 3, 1),
    (3, 4, -3)
]

start = 0
print(bellman_ford(V, edges, start))

# ๊ฒฐ๊ณผ
[0, 4, 2, 3, 0]

 

 


๐Ÿ“„   ์ฝ”๋“œ

def bellman(V, edges, start):
    INF = float('inf')  # ๋ฌดํ•œ๋Œ€ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์ดˆ๊ธฐ ๊ฑฐ๋ฆฌ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
    dist = [INF] * (V+1)  # ๋ชจ๋“  ์ •์ ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”
    dist[start] = 0  # ์‹œ์ž‘ ์ •์ ์˜ ๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ ์„ค์ •

    # ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ (V๋ฒˆ ๋ฐ˜๋ณต)
    for _ in range(V):  
        for u, v, w in edges:  # ๋ชจ๋“  ๊ฐ„์„ (u → v, ๊ฐ€์ค‘์น˜ w)์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธ ์‹œ๋„
            if dist[u] != INF and dist[u] + w < dist[v]:  
                dist[v] = dist[u] + w  # ๋” ์งง์€ ๊ฒฝ๋กœ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 

    # ์Œ์˜ ์‚ฌ์ดํด ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
    for u, v, w in edges:
        if dist[u] != INF and dist[u] + w < dist[v]:  
            return -1  # ์Œ์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋ฉด -1 ๋ฐ˜ํ™˜

    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์ •์ ์˜ ๊ฑฐ๋ฆฌ ๊ฐ’์„ -1๋กœ ๋ณ€๊ฒฝ
    for i in range(V+1):
        if dist[i] == INF:
            dist[i] = -1

    return dist  # ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด ๋ฐ˜ํ™˜

def main():
    N, M = map(int, input().split())  # ์ •์  ์ˆ˜ N, ๊ฐ„์„  ์ˆ˜ M ์ž…๋ ฅ
    edges = [tuple(map(int, input().split())) for _ in range(M)]  # ๊ฐ„์„  ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ
    start = 1  # ์‹œ์ž‘ ์ •์ ์„ 1๋ฒˆ์œผ๋กœ ๊ณ ์ •
    dist = bellman(N, edges, start)  # ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰

    if dist == -1:
        print(dist)  # ์Œ์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋ฉด -1 ์ถœ๋ ฅ
    else:
        print(*dist[2:], sep='\n')  # 2๋ฒˆ ์ •์ ๋ถ€ํ„ฐ ์ถœ๋ ฅ (1๋ฒˆ ์ œ์™ธ)

if __name__ == "__main__":
    main()

 

 

 


โœ๐Ÿป   ํ’€์ด

์‹œ๊ฐ„ ๋ณต์žก๋„ : O(VM)

 

  1. ์ดˆ๊ธฐํ™”
    • dist ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“  ์ •์ ์˜ ์ตœ๋‹ค ๊ฑฐ๋ฆฌ๋ฅผ INF(๋ฌดํ•œ๋Œ€)๋กœ ์„ค์ •ํ•œ๋‹ค.
    • ์‹œ์ž‘ ์ •์ ์˜ ๊ฑฐ๋ฆฌ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. (dist[start] = 0)
  2. V๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
    • ๋ชจ๋“  ๊ฐ„์„ ์„ ํ™•์ธํ•˜๋ฉฐ, ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋ณด๋‹ค ๋” ์งง์€ ๊ฒฝ๋กœ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
    • ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ์ตœ๋Œ€ V๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ณด์žฅ๋œ๋‹ค. (for _ in range(V))
  3. ํ•ด๋‹น ๋„์‹œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ™•์ธ
    • edges๋ฅผ ํ•œ ๋ฒˆ ๋” ๋Œ๋ฉด์„œ, dist[u] + w < dist[v]๊ฐ€ ์„ฑ๋ฆฝํ•˜๋ฉด ์Œ์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋ชจ๋“  ์ •์ ์ด ๋ฌดํ•œํžˆ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • (๋ฌธ์ œ์—์„œ ๋‹ค์Œ ๋ถ€๋ถ„์— ํ•ด๋‹น)
      • ๋งŒ์•ฝ 1๋ฒˆ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด ์–ด๋–ค ๋„์‹œ๋กœ ๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์‹œ๊ฐ„์„ ๋ฌดํ•œํžˆ ์˜ค๋ž˜ ์ „์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฒซ์งธ ์ค„์— -1์„ ์ถœ๋ ฅํ•œ๋‹ค.
  4. ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์ •์  ์ฒ˜๋ฆฌ
    • ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ์ •์ ์€ -1๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  5. ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    • dist = -1์ด๋ฉด, -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • dist != -1์ด๋ฉด, 2๋ฒˆ ๋„์‹œ๋ถ€ํ„ฐ ์ตœ๋‹จ ๊ฒฝ๋กœ(dist[i])๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

 

 

 

 

728x90