Cometin'

BOJ-11779 - Python

2021-01-21 at Algorithm category

n개의 도시, m개의 버스가 있다. 버스는 출발, 도착, 비용을 갖는다. 시작 도시와 도착 도시가 주어질 때, 최소 비용으로 이동했을 시 총 비용, 경로에 포함돼 있는 도시의 수, 경로를 방문하는 도시를 순서대로 출력하는 문제. 힙 자료구조를 이용한 다익스트라 방법을 이용하여 최소 비용을 구함과 동시에 방문지를 저장할 배열을 이용하여 초기화, 지금까지 방문했던 곳 추가, 다음 도시 추가 연산을 통해 풀었다.

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

def solve(n, graph, S, E):
    dist = [INF for _ in range(n+1)]
    visited = [[] for _ in range(n+1)]
    q = []

    # cost, current position, visited position
    heapq.heappush(q, [0, S])
    dist[S] = 0
    visited[S] = [S]

    while q:
        cost, now = heapq.heappop(q)

        if cost > dist[now]:
            continue

        for np, tc in graph[now]:
            nc = cost + tc
            if nc < dist[np]:
                heapq.heappush(q, [nc, np])
                dist[np] = nc

                visited[np] = []
                for v in visited[now]:
                    visited[np].append(v)
                visited[np].append(np)

    return dist[E], visited[E]

n = int(input())
m = int(input())
graph = [[] for _ in range(n+1)]

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

S, E = map(int, input().split())

d, v = solve(n, graph, S, E)
print(d)
print(len(v))
print(*v)

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.