관리 메뉴

커리까지

[백준] 1238번 파티 파이썬 본문

알고리즘/풀이

[백준] 1238번 파티 파이썬

목표는 커리 2022. 1. 19. 23:11
728x90
SMALL

문제

N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.

어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.

각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.

이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.

입력

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

모든 학생들은 집에서 X에 갈수 있고, X에서 집으로 돌아올 수 있는 데이터만 입력으로 주어진다.

출력

첫 번째 줄에 N명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.

예제 입력 1

4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3

예제 출력 1

10

제출답안

import heapq
import sys
input = sys.stdin.readline

INF = int(1e9)

def solution():
    n, m, start = map(int, input().split())
    graph = [[] for _ in range(n + 1)]
    for _ in range(m):
        a, b, c = map(int, input().split())
        graph[a].append((b, c))
    answer = [0] * (n + 1)
    for i in range(1, n + 1):
        distance_temp = dijkstra(n, i, graph)
        answer[i] += distance_temp[start]
        distance_temp = dijkstra(n, start, graph)
        answer[i] += distance_temp[i]
    print(max(answer))


def dijkstra(n, start, graph):
    distance = [INF] * (n + 1)
    q = []
    heapq.heappush(q, (0, start))
    distance[start] = 0
    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]))
    return distance

solution()
  1. 학생수, 도로, 출발지를 받는다.
  2. 도로 연결 정보를 담는 리스트를 만든다.
  3. for문을 돌면서 도로수만큼 도로 연결 정보를 업데이트 한다.
  4. 다익스르라 함수를 2번 사용한 이유는 start로 갔다가 다시 와야 하기 때문에 i번째로 가는 최단 경로를 구해서 start에서 i까지 얼머나 걸리는지
    1. start의 최단거리를 구해서 i까지 얼마나 걸리는지 각각 더해줘야 하기 때문에 2번 계산한다.
  5. 다익스트라 함수는 거리를 매번 초기화 해준다.
  6. 힙을 사용해서 시간을 단축한다.
  7. q가 빌 때까지 계속 해서 거리를 갱신한다.
  8. 마지막으로 출력한다.
728x90
LIST
Comments