Leta Learns

[Python] 백준 1238번 - 파티 본문

Coding/백준

[Python] 백준 1238번 - 파티

leta 2021. 8. 2. 18: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

 

다익스트라.. 아무 생각 없이 시도했다가... 피 봤다....

 

heapq 쓰는 방법 어려워서 고민하다가 다익스트라 예제 코드 구글링해서 참고했다.

 

이 문제에서 포인트는 파티를 여는 마을(x)로 갈 때 dijkstra 한 번,

파티가 끝나고 집에 갈 때 dijkstra 한 번.

총 두 번 dijkstra 함수를 호출해야 한다는 것이다.

 

dijkstra 함수 내부에 거리 배열을 return 값으로 받아서

go_party(파티 갈 때), go_home(끝나고 집 올 때) 변수에 각각 할당해주었다.

문제의 정답은 지금까지의 최댓값(ans)과 현재의 값을 비교하여 더 큰 값으로 갱신하여 구하였다.

현재의 값을 찾을 때는 go_party, go_home에 저장되어 있는 dist 배열 중 목적지의 값을 찾아와야 한다.

=> go_party[x], go_home[i]

 

 

....어렵다.........................................................................

 

import sys
import heapq
input = sys.stdin.readline

def dijkstra(start):
    q = []
    dist = [float('inf')] * (n+1)
    heapq.heappush(q, (0, start)) #(dist, current)
    dist[start] = 0

    while q:
        distance, current = heapq.heappop(q)
        if distance > dist[current]:
            continue
        for i_end, i_t in graph[current]:
            new_dist = distance + i_t
            if new_dist < dist[i_end]:
                dist[i_end] = new_dist
                heapq.heappush(q, (new_dist, i_end))
    return dist

n, m, x = map(int, input().split())
graph = [[] for i in range(n+1)]

for j in range(m):
    start, end, t = map(int, input().split())
    graph[start].append([end, t])

ans = 0
for i in range(1, n+1):
    go_party = dijkstra(i)
    go_home = dijkstra(x)
    ans = max(ans, go_party[x] + go_home[i])

print(ans)

 

 

 

Comments