Notice
Recent Posts
Link
Today
Total
10-06 00:17
๊ด€๋ฆฌ ๋ฉ”๋‰ด

dingdong coding

[ ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ ] ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ณธ๋ฌธ

๐Ÿ”ตCoding Test/Algorithm

[ ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ ] ์ตœ๋‹จ ๊ฒฝ๋กœ

๐Ÿถ ๊ฐœ๋ฐœ๊ฐœ๋ฐœ ๐Ÿพ 2022. 5. 2. 16:50

 

 ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์ƒํ™ฉ 

    • ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํ•œ ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ 

    • ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ 

    • ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ 

 

๊ฐ ์ง€์ ์€ ๊ทธ๋ž˜ํ”„์—์„œ ๋…ธ๋“œ๋กœ ํ‘œํ˜„ 

์ง€์ ๊ฐ„ ์—ฐ๊ฒฐ๋œ ๋„๋กœ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„ 

 

๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

 ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    • ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋„๋กœ(๊ฐ„์„ )์€ ์Œ์˜ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

• ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

    • ๋งค ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ์ž„์˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

 

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

 

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

์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ฉด '์ด์ œ๋ถ€ํ„ฐ๋Š” ์ด ๊ฒฝ๋กœ๊ฐ€ ์ œ์ผ ์งง์€ ๊ฒฝ๋กœ์•ผ'๋ผ๊ณ  ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

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

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

 

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

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

 

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

    • ์™„๋ฒฝํ•œ ํ˜•ํƒœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ์†Œ์Šค์ฝ”๋“œ์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋” ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 

 

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

input = sys.stdin.readline
INF = int(1e9)  # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())

# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())

# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
# ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•˜์—ฌ ๋ฐ”๋กœ ๋ฆฌ์ŠคํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก
graph = [[] for i in range(n + 1)]

# ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
visited = [False] * (n + 1)
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m): # m : ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ

# ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
def get_smallest_node():
    min_value = INF
    index = 0 # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
    for i in range(1, n+1):
        if distance[i] < min_value and not visited[i]:
            min_value = distance[i]
            index = i
    return index

def dijkstra(start):
    # ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
    distance[start] = 0
    visited[start] = True
    for j in graph[start]:
        distance[j[0]] = j[1]
    # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n-1 ๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
    for i in range(n-1):
        # ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        now = get_smallest_node()
        visited[now] = True
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
        for j in graph[now]:
            cost = distance[now] + j[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[j[0]]:
                distance[j[0]] = cost

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n+1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์„ฑ๋Šฅ ๋ถ„์„

์ด O(V)๋ฒˆ์— ๊ฑธ์ณ์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๋งค๋ฒˆ ์„ ํ˜• ํƒ์ƒ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V²)์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ์—์„œ ์ „์ฒด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5,000๊ฐœ ์ดํ•˜๋ผ๋ฉด ์ด ์ฝ”๋“œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ํ•˜์ง€๋งŒ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10,000๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๋ฌธ์ œ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

 

๊ฐœ์„ ๋œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 

 

์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ํ™•์ธํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Python, C++, Java๋ฅผ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋ฃŒ๊ตฌ์กฐ  ์ถ”์ถœ๋˜๋Š” ๋ฐ์ดํ„ฐ 
์Šคํƒ(Stack) ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ
ํ(Queue) ๊ฐ€์žฅ ๋จผ์ € ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ
์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue) ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ 

 

ํž™ (Heap)

์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ตœ์†Œ ํž™(Min Heap)๊ณผ ์ตœ๋Œ€ ํž™(Max Heap)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํฌํ•จํ•ด ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„ ๋ฐฉ์‹ ์‚ฝ์ž… ์‹œ๊ฐ„ ์‚ญ์ œ ์‹œ๊ฐ„
๋ฆฌ์ŠคํŠธ O(1) O(N)
ํž™(Heap) O(logN) O(logN)

 

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

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋ณธ์›๋ฆฌ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

    • ํ˜„์žฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•ด ๋†“๊ธฐ ์œ„ํ•ด์„œ ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด์šฉํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

    • ํ˜„์žฌ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์†Œ ํž™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

import heapq
import sys

input = sys.stdin.readline
INF = int(1e9)  # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
    graph[a].append((b, c))

def dijkstra(start):
    q = []
    # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
    heapq.heappush(q, (0, start))
    distance[start] = 0
    while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n+1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])

 

๊ฐœ์„ ๋œ ๊ตฌํ˜„๋ฐฉ๋ฒ• ์„ฑ๋Šฅ ๋ถ„์„ 

ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(ElogV)์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ(while๋ฌธ)์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ V ์ด์ƒ์˜ ํšŸ์ˆ˜๋กœ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ˜„์žฌ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊บผ๋ƒ” ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์„ ํ™•์ธํ•˜๋Š” ์ดํšŸ์ˆ˜๋Š” ์ตœ๋Œ€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(E)๋งŒํผ        ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ง๊ด€์ ์œผ๋กœ ์ „์ฒด ๊ณผ์ •์€ E๊ฐœ์˜ ์›์†Œ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ชจ๋‘ ๋นผ๋‚ด๋Š” ์—ฐ์‚ฐ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    • ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(ElogE)๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ค‘๋ณต ๊ฐ„์„ ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์ด๋ฅผ O(ElogV)๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        • O(ElogE) → O(ElogV²) O(2ElogV) O(ElogV)

 

 

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ(Floyd-Warshall)์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ๊ณ„๋ณ„๋กœ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

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

 

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์€ 2์ฐจ์› ํ…Œ์ด๋ธ”์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์œ ํ˜•์— ์†ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํŠน์ •ํ•œ ๋…ธ๋“œ k๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • a์—์„œ b๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ณด๋‹ค a์—์„œ k๋ฅผ ๊ฑฐ์ณ b๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

INF = int(1e9) #๋ฌดํ•œํ•จ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๋ฐ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n = int(input())
m = int(input())
#2์ฐจ์› ๋ฆฌ์ŠคํŠธ(๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋ฅผ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๊ฐ’์„ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
graph = [[INF]*(n+1) for _ in range(n+1)]

#์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n+1):
    for b in range(1, n+1):
        if a==b:
            graph[a][b] = 0

# ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„, ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in range(m):
    # A์—์„œ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ C๋ผ๊ณ  ์„ค์ •
    a, b, c = map(int, input().split())
    graph[a][b] = c

# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
for k in range(1, n+1) :
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

# ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
for a in range(1, n+1) :
    for b in range(1, n+1):
        # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ (INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
        if graph[a][b] == INF:
            print("INFINITY", end=" ")
        # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else:
            print(graph[a][b], end=" ")
    print()

 

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ ๋ถ„์„

๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ N๊ฐœ์ผ ๋•Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ƒ์œผ๋กœ N๋ฒˆ์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค O(N²)์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N³)์ž…๋‹ˆ๋‹ค.

 

 

๊ฐ•์˜ ๋ฐ ์ถœ์ฒ˜

 

Comments