[BOJ] 1238. ํŒŒํ‹ฐ(๐Ÿฅ‡, ๋‹ค์ต์ŠคํŠธ๋ผ)

lemythe423ยท2023๋…„ 8์›” 10์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
24/133
post-thumbnail

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

ํ’€์ด

๐Ÿฅฒ ์ผ๋ฐ˜ ๋‹ค์ต์ŠคํŠธ๋ผ(1288ms)

N๋ฒˆ ๋งˆ์„ โ†’ X๋ฒˆ ๋งˆ์„ โ†’ N๋ฒˆ ๋งˆ์„ ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. M๊ฐœ์˜ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๊ฐ ๋งˆ์„์—์„œ ๋‹ค๋ฅธ ๋งˆ์„๋“ค๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•œ ๋‹ค์Œ์— (1) N โ†’ X (2) X โ†’ N ์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ๋กœ๋ฅผ ๋”ํ•œ ๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

๋ฒ”์œ„๊ฐ€ ํฌ์ง€ ์•Š๋‹ค๋ฉด ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n^3)์ด๊ณ  N์˜ ์ตœ๋Œ€๊ฐ’์€ 1000์ด๋ฏ€๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋Œ€์‹  ๊ฐ๊ฐ์˜ N์— ๋Œ€ํ•ด์„œ ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ์ด๋•Œ N๋งˆ์„๋“ค์—์„œ๋Š” X๋งˆ์„๊นŒ์ง€์˜ ์œ„์น˜๋งŒ ๊ตฌํ•˜๋ฉด ๋˜๊ณ , ๋ชจ๋“  ๋งˆ์„๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฑด X๋งˆ์„๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ผ๋‹จ ์ด ๋ถ€๋ถ„์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ชจ๋“  N๋งˆ์„์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋งˆ์„๋“ค์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ–ˆ๋‹ค.

์‹ค์ˆ˜ํ•œ ์ 

์ด๋•Œ time์„ ์ฒ˜์Œ๋ถ€ํ„ฐ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ณ  ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์–ด์ฐจํ”ผ ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” n๋งˆ์„์—์„œ ๋‹ค๋ฅธ ๋งˆ์„๋กœ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” 1์ฐจ์› ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋งˆ์„์— ๋Œ€ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐ’๋“ค์„ ๊ตฌํ•œ ๋‹ค์Œ์— return ํ•ด์„œ time ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋๋‹ค.

ํž™์—์„œ ๋‹ค์Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์œ„์น˜๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ, ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋Œ“๋‹ˆ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” res[i] != t์—์„œ๋„ continue๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฒˆ ํšŒ์ฐจ๋งŒ ๋„˜์–ด๊ฐ€๋„๋ก ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ return์„ ์‚ฌ์šฉํ•ด์„œ ๊ณ„์† ์—๋Ÿฌ๋ฅผ ๋ƒˆ๋‹ค.

import heapq

def dijk(s, x): # s: ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ์ง€์ 
    res = [1e9]*n
    res[s] = 0
    pq = [(0, s)]
    while pq: 
        t, i = heapq.heappop(pq)
        if res[i] != t:
            continue
        for j, jt in arr[i]:
            dist = t + jt
            if res[j] > dist:
                res[j] = dist
                heapq.heappush(pq, (dist, j))

    return res

n, m, x = map(int, input().split())
x -= 1
arr = [[]*n for _ in range(n)]

for _ in range(m):
    a, b, t = map(int, input().split())
    arr[a-1].append((b-1, t))

time = []
for i in range(n):
    time.append(dijk(i, x))

mv = 0
for i in range(n):
    mv = max(mv, time[i][x]+time[x][i])
print(mv)

๐Ÿ˜‡ ์—ญ๋ฐฉํ–ฅ ๋‹ค์ต์ŠคํŠธ๋ผ(300ms)

๊ฐ๊ฐ์˜ N๋งˆ์„์—์„œ๋Š” X๋งˆ์„๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋งŒ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค

์ด ์ ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด N๋งˆ์„์—์„œ X๋งˆ์„๊นŒ์ง€ ๊ฐ€๋Š” ๋‹จ๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ๋“ค์„ ๊ฑฐ๊พธ๋กœ ์„ค์ •(์—ญ๋ฐฉํ–ฅ)ํ•œ ๋‹ค์Œ์— X๋งˆ์„๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋งˆ์„๋“ค๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๊ทธ๊ฒŒ N๋งˆ์„์—์„œ X๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ?

X = 1์ผ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด๋ผ๋ฉด, ์ด ๋ฐฉํ–ฅ์„ ๊ฑฐ๊พธ๋กœ ํ•ด์ฃผ๋ฉด 1์—์„œ ๋‹ค๋ฅธ ๋งˆ์„๋“ค๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ = ๋‹ค๋ฅธ ๋งˆ์„์—์„œ 1๋กœ ์˜ค๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” 2๋ฒˆ์—์„œ 1๋ฒˆ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋งŒ ์•Œ๋ฉด ๋˜๋Š”๋ฐ ์œ„์˜ ํ’€์ด์—์„œ๋Š” 2๋ฒˆ์—์„œ 3๋ฒˆ, 4๋ฒˆ, 5๋ฒˆ์œผ๋กœ ๊ฐ€๋Š” ๋ชจ๋“  ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋‹ค ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

import heapq
import sys
input = sys.stdin.readline

def dijk(arr, s): # s: ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ์ง€์ 
    res = [1e9]*n
    res[s] = 0
    pq = [(0, s)]
    while pq: 
        t, i = heapq.heappop(pq)

        if res[i] != t:
            continue

        for j, jt in arr[i]:
            dist = t + jt
            if res[j] > dist:
                res[j] = dist
                heapq.heappush(pq, (dist, j))
    return res

n, m, x = map(int, input().strip().split())
x -= 1
graph = [[]*n for _ in range(n)]
reverse = [[]*n for _ in range(n)]

for _ in range(m):
    a, b, t = map(int, input().strip().split())
    graph[a-1].append((b-1, t))
    reverse[b-1].append((a-1, t))

graph_dist = dijk(graph, x) # x๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๊ณณ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
reverse_dist = dijk(reverse, x) # ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ x๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ

print(max([graph_dist[i] + reverse_dist[i] for i in range(n)]))
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€