1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
문제
아이디어
그래프의 최단 경로를 구하여 코스트를 계산하는 문제이므로 다익스트라 알고리즘을 사용하였다.
풀이
heapq를 이용해 다익스트라를 구현하였다.
def dijkstra(start):
q = []
distance = [sys.maxsize] * (N + 1)
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for nodeIndex, nodeCost in data[now]:
cost = dist + nodeCost
if distance[nodeIndex] > cost:
distance[nodeIndex] = cost
heapq.heappush(q, (cost, nodeIndex))
return distance
result = 0
for i in range(1, N + 1):
go = dijkstra(i)
back = dijkstra(X)
result = max(result, go[X] + back[i])
파티에 갈때의 최소경로와 돌아올 때의 최소경로를 구해야하므로 다익스트라를 2번사용하였고, 각각의 경우를 더한값의 가장 큰 코스트를 얻어 출력하여 해결하였다.
코드
import heapq
import sys
N, M, X = map(int, input().split())
data = [[] for _ in range(N+1)]
for i in range(M):
a, b, c = map(int, input().split())
data[a].append((b, c))
def dijkstra(start):
q = []
distance = [sys.maxsize] * (N + 1)
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for nodeIndex, nodeCost in data[now]:
cost = dist + nodeCost
if distance[nodeIndex] > cost:
distance[nodeIndex] = cost
heapq.heappush(q, (cost, nodeIndex))
return distance
result = 0
for i in range(1, N + 1):
go = dijkstra(i)
back = dijkstra(X)
result = max(result, go[X] + back[i])
print(result)
'알고리즘' 카테고리의 다른 글
[백준 파이썬] 11660 구간 합 구하기5 (0) | 2023.11.13 |
---|---|
[백준 파이썬] 18110 solved.ac (0) | 2023.11.10 |
[백준 파이썬] 1167 트리의 지름 (0) | 2023.11.06 |
[백준 파이썬] 2096 내려가기 (0) | 2023.11.01 |
[백준 파이썬] 1504 특정한 최단 경로 (1) | 2023.10.29 |