반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

1753 최단경로 본문

코딩 테스트(Python)/백준, 프로그래머스

1753 최단경로

5_hyun 2022. 7. 7. 14:27

https://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

 

해결법

이 문제는 다익스트라 알고리즘을 활용해서 푸는 문제다. graph에 연결된 노드를 저장할 때는 플로이드 알고리즘과 다르게 저장한다는 점을 다시 기억하면 좋을 것 같다. 다익스트라 알고리즘에서 graph에 연결된 노드를 저장하는 법은 시작 노드 a, 연결된 노드 b, 가중치 c를 graph[a].append(b, c)이다. 이 점을 유의하고 푼다면 좀 더 빨리 문제를 풀 수 있을 것 같다.

플로이드 알고리즘으로도 문제를 풀어봤지만 메모리 초과가 발생했다.

 

코드

import heapq

v, e = map(int, input().split())
start = int(input())
INF = int(1e9)

graph = [[] for i in range(v+1)]
distance = [INF] * (v+1)

for i in range(e):
    a, b, c = map(int, input().split())
    graph[a].append((b, c))

def dijkstra(start):
    distance[start] = 0
    q = []
    heapq.heappush(q, (0, start))
    
    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]))

dijkstra(start)

for i in range(1, v+1):
    if distance[i] < INF:
        print(distance[i])
    else:
        print("INF")

이 처럼 다익스트라 알고리즘을 활용해서 문제를 풀 수 있다.

728x90
반응형

'코딩 테스트(Python) > 백준, 프로그래머스' 카테고리의 다른 글

프로그래머스) 메뉴 리뉴얼(조합)  (0) 2023.02.21
1931 회의실 배정  (0) 2022.06.29
9095 1, 2, 3 더하기  (0) 2022.06.26
17219 비밀번호 찾기  (0) 2022.06.25
1로 만들기(백준)  (0) 2022.06.22
Comments