https://www.acmicpc.net/problem/1238
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
백준 - 파티 (Silver Cow Party) (1238번)
난이도 : Gold 3
알고리즘 : Dijkstra (다익스트라)
Time Complexity : O( E * logV )
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
def dijkstra(b, d):
pq = [(0, X)]
while pq:
t, v = heappop(pq)
if d[v] < t:
continue
for tt, vv in b[v]:
if d[vv] <= t+tt:
continue
d[vv] = t+tt
heappush(pq, (t+tt, vv))
if __name__ == '__main__':
INF = sys.maxsize
N, M, X = map(int, input().split())
ib = [[] for _ in range(N+1)]
ob = [[] for _ in range(N+1)]
iid = [INF] * (N+1)
ood = [INF] * (N+1)
iid[X] = ood[X] = 0
for _ in range(M):
a, b, t = map(int, input().split())
ib[b].append((t, a))
ob[a].append((t, b))
dijkstra(ib, iid)
dijkstra(ob, ood)
print(max(sum(tup) for tup in zip(iid[1:], ood[1:])))
2개의 그래프를 분리해서 만들어야 한다.
ib[m] : 노드 m으로 들어오는 방향의 간선들을 저장하는 리스트
ob[m] : 노드 m에서 나가는 방향의 간선들을 저장하는 리스트
각 시점에서, 노드 X로부터 노드 m까지 최소 거리를 저장하는 리스트도 따로 만든다.
iid[m] : m에서 X까지 최소거리 저장하는 리스트
ood[m] : X에서 m까지 최소거리 저장하는 리스트
위와 같이 리스트들을 구성한 다음,
다익스트라(dijkstra) 알고리즘을
들어오는 방향과 나가는 방향 각각 한 번씩
총 두 번 실행한다.
이후, 거리를 저장한 iid와 ood의 값을 각 노드 별로 더하면서
최대값을 출력하면 된다.
'Algorithm' 카테고리의 다른 글
탑 (2493번) - 백준 (BOJ) (0) | 2023.06.10 |
---|---|
추석 트래픽 (17676번) - 프로그래머스 (Programmers) (1) | 2023.06.09 |
과제 진행하기 (176962번) - 프로그래머스 (Programmers) (0) | 2023.06.07 |
도서관 (1461번) - 백준 (BOJ) (0) | 2023.06.06 |
치즈 (2638번) - 백준 (BOJ) (0) | 2023.06.05 |