📊알고리즘, 문제풀이/📈문제풀이 (PS)

[알고리즘][Python] 백준 1238 파티 문제 풀이

Written by Donghak Park

문제 출처 : www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net


문제 해석 : 어떤 정점에서 한 정점으로 왕복하는 거리가 가장 먼 것을 찾는 문제이다. 파티를 갔다오는 사람들은 항상 최단 경로로 왕복한다고 했기 때문에 최단 경로로 특수 정점을 왕복하는 문제로 해석 가능하다.

 

문제 풀이 :  다익스트라 알고리즘을 통해서 문제를 풀 수 있다.

- 플루이드 워셜 문제로 풀 경우에는 10^9로 시간 복잡도가 너무 크기 때문에 시간 초과가 난다.

- 우선순위 큐를 이용한 다익스트라 알고리즘을 적용해야한다.


풀이 코드

import sys, heapq
INF = sys.maxsize
input = sys.stdin.readline

def dijkstra(start_node):
    distance = [INF] * (N+1)
    heap = []
    heapq.heappush(heap, [0, start_node])
    distance[start_node] = 0

    while heap:
        now_cost, node = heapq.heappop(heap)
        for next_cost, next_node in graph[node]:
            next_cost = next_cost + now_cost

            if next_cost < distance[next_node]:
                distance[next_node] = next_cost
                heapq.heappush(heap, [next_cost, next_node])

    return distance

N, M, X = map(int, input().split())

graph = [[] * (N+1) for _ in range(N+1)]


for i in range(M):
    start, end, cost = map(int, input().split())
    graph[start].append([cost,end])

answer = [0] * (N+1)

for i in range(1,N+1):
    arr = dijkstra(i)
    answer[i] += arr[X]
    arr2 = dijkstra(X)
    answer[i] += arr2[i]

print(max(answer))

author : donghak park
contact : donghark03@naver.com

## 문제의 저작권은 백준 알고리즘 사이트에 있습니다. 혹시 문제가 되는 부분이 있으면 연락 바랍니다.