본문으로 바로가기

[BOJ 1238] 파티 (Python)

category Algorithm | SQL/BOJ 2021. 5. 15. 22:49

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

 

다익스트라 알고리즘을 이용하여 최단거리로 X번 마을을 반환점으로 하여 왕복했을 때

가장 많은 시간을 소비하는 학생을 구하는 문제.

 

N이 1000이기 때문에 N^3인 플로이드워셜은 사용할 수 없을 것이라 판단하였다.

heapq를 이용한 다익스트라 알고리즘을 N번 돌려서 모든 출발점으로부터 X까지의 최단 경로를 구하였고,

X번 마을에서 다른 마을들까지의 최단거리 테이블을 따로 저장해 두었다가

두 리스트를 합쳤을때 원소의 최댓값을 구해주었다.

 

import heapq
import sys

input = sys.stdin.readline
INF = int(1e9)

n, m, x = map(int, input().split())
graph = [[] for _ in range(n + 1)]
distance = [INF] * (n + 1)
res = [0]
res2 = []


def dijkstra(start):
    global res2
    q = []
    distance = [INF] * (n + 1)
    distance[start] = 0
    heapq.heappush(q, (0, start))

    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]))
    if start == x:
        res2 = distance
    res.append(distance[x])


for _ in range(m):
    a, b, c = map(int, input().split())
    graph[a].append((b, c))

for i in range(1, n + 1):
    dijkstra(i)

ans = list(map(sum, zip(res, res2)))

print(max(ans[1:]))

'Algorithm | SQL > BOJ' 카테고리의 다른 글

[BOJ 1194] 달이 차오른다, 가자 (Python)  (0) 2021.04.21