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

[알고리즘][Python] 백준 1753 최단경로 문제 풀이

Written by Donghak Park

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

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.

www.acmicpc.net


문제 해석 : 방향 그래프가 주어질 때 시작점에서 각 정점으로 가는 최단 경로를 구하여 출력하는 문제이다.

 

문제 풀이 : 모든 점에 대한 거리를 구할 때 

 

1. 다익스트라

2. 플루이드 워셜

 

알고리즘을 활용할 수 있다. 이 문제에서는 정점의 개수가 20,000까지 주어지기 때문에 우선순위 큐를 활용한 다익스트라 알고리즘을 활용해서 풀어야 시간 초과를 피할 수 있다.


풀이 코드

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


def dijstra(start):

    distance = [INF] * (V+1)
    Q = []

    heapq.heappush(Q, [0, start])
    distance[start] = 0

    while Q:
        now_cost, now_vertex = heapq.heappop(Q)

        for next_cost, next_vertex in graph[now_vertex]:
            next_cost = next_cost + now_cost
            if next_cost < distance[next_vertex]:
                distance[next_vertex] = next_cost
                heapq.heappush(Q, [next_cost, next_vertex])

    return distance


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

K = int(input()) # 시작 정점

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

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

answer_arr = dijstra(K)

for i in range(1, len(answer_arr)):
    if i == K:
        print(0)
    elif answer_arr[i] == INF:
        print("INF")
    else:
        print(answer_arr[i])

author : donghak park
contact : donghark03@naver.com

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