문제해결(PS)/백준(BOJ)

백준 1238 파티

곰탱이장 2025. 1. 18. 15:52

https://www.acmicpc.net/problem/1238

 

 이 문제는 단방향 엣지가 주어진 그래프에서, 모든 노드에서 특정 노드로  최단거리로 왕복했을 때의 최댓값을 구하는 문제이다. 

 

 이 문제는 다익스트라 알고리즘을 사용하면 간편하게 풀 수 있다. 다만 오고 갈 때가 다르기에, 필자는 올때의 그래프, 갈때의 그래프를 따로 만들고 시작점을 X로 하여 모든 노드로 가는 최단거리를 구하고 각 인덱스에서 더해서 최댓값을 구했다.

 X를 도착으로 하든 시작으로 하든, 어차피 그래프만 거꾸로 뒤집으면 X를 시작으로 하여, 오고가는 것을 다 커버할 수 있다.

import sys
input = sys.stdin.readline
import math
import heapq

def dijkstra(start,graph):
    d=[math.inf for _ in range(N+1)]
    d[start]=0

    heap = []
    heapq.heappush(heap,[0,start])

    while heap:
        cur_w,cur_n = heapq.heappop(heap)

        for next_w,next_n in graph[cur_n]:
            if cur_w+next_w < d[next_n]:
                d[next_n] = cur_w+next_w
                heapq.heappush(heap,[d[next_n],next_n])
    
    return d[1:]

N,M,X = map(int,input().rstrip().split())
go_graph=[[] for _ in range(N+1)]#X에서 출발
come_graph=[[] for _ in range(N+1)]#반대로 하여,X에서 출발

for _ in range(M):
    s,e,c = map(int,input().rstrip().split())
    go_graph[s].append([c,e])
    come_graph[e].append([c,s])

go=dijkstra(X,go_graph)
come=dijkstra(X,come_graph)
max_=-1

for i in range(N):
    if go[i]+come[i] > max_:
        max_=go[i]+come[i]

print(max_)

 

'문제해결(PS) > 백준(BOJ)' 카테고리의 다른 글

백준 2206 벽 부수고 이동하기  (1) 2025.01.27
백준 1865 웜홀  (0) 2025.01.25
백준 11404 플로이드  (0) 2025.01.18
백준 1167 트리의 지름  (0) 2025.01.17
백준 9663 N-Queen  (0) 2025.01.16