1753 최단경로 python

    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

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    문제 접근

    다익스트라 알고리즘

     

    필요한 변수

    -변수-
    dp: 최종 비용을 저장해둠
    heap: 가중치를 계산하기위해 사용하는 힙
    graph: 입력으로 주어지는 그래프를 저장 [다음 노드, 다음 가중치]

    https://namu.wiki/w/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

     

    다익스트라 알고리즘 - 나무위키

    다익스트라 알고리즘은 다음과 같다. (P[A][B]는 A와 B 사이의 거리라고 가정한다) 출발점으로부터의 최단거리를 저장할 배열 d[v]를 만들고, 출발 노드에는 0을, 출발점을 제외한 다른 노드들에는

    namu.wiki

    https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%81%AC%EC%8A%A4%ED%8A%B8%EB%9D%BC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

     

    데이크스트라 알고리즘 - 위키백과, 우리 모두의 백과사전

    위키백과, 우리 모두의 백과사전. 컴퓨터 과학에서 데이크스트라 알고리즘(영어: Dijkstra algorithm) 또는 다익스트라 알고리즘은 도로 교통망 같은 곳에서 나타날 수 있는 그래프에서 꼭짓점 간의

    ko.wikipedia.org

    모든 경로의 최단경로를 파악하는 알고리즘.

    꺼무위키나 위키피디아를 보면 이해하기쉽고 처음 풀땐 코드먼저 보면서 풀었다.

     

     

     

     

    엄청나게 틀렸는데, heap에 저장할때 (가중치, 다음노드)로 저장해야하는데 (다음노드, 가중치)로 저장했다가 시간초과로 엄청 틀렸다.

    이게 왜 틀린지 몰라서 머리가 엄청 아팠는데.... 너무나도 당연했다.

    (다음노드, 가중치)순으로 heap에 저장하면 매번 heap을 찾을때 마다 다음노드를 먼저보고 같으니 가중치로 넘어가게된다...

    처음부터 가중치를 먼저 확인하면 시간이 훨씬 줄어드니 당연한 사실이였다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    틀린 코드

    import heapq
    import sys
    input = sys.stdin.readline
    
    """
    다익스트라 알고리즘
    
    -변수-
    dp: 최종 비용을 저장해둠
    heap: 가중치를 계산하기위해 사용하는 힙
    graph: 입력으로 주어지는 그래프를 저장 [다음 노드, 다음 가중치]
    
    """
    
    INF = sys.maxsize
    V, E = map(int,input().split())
    K = int(input())
    graph = [[] for i in range(V+1)]
    dp = [INF] * (V+1)
    heap = []
    
    #경로
    for i in range(E):
        u, v, w = map(int,input().split())
        graph[u].append((v,w))
    
    def dijkstra(start):
        dp[start] = 0
        heapq.heappush(heap, (start, 0))
    
        while heap:
            cur_node, cur_w = heapq.heappop(heap)
    
            #최단거리가 아니면 넘어감
            if dp[cur_node] < cur_w:
                continue
    
            for next_node, w in graph[cur_node]:
                next_w = cur_w + w
    
                #더 짧은 거리라면, 새로 바꾸고 heap에 추가
                if next_w < dp[next_node]:
                    dp[next_node] = next_w
                    heapq.heappush(heap, (next_node, next_w))
    
    dijkstra(K)
    for i in dp[1:]:
        print(i if i != INF else "INF")

     

     

     

     

     

    맞힌 코드

    import heapq
    import sys
    input = sys.stdin.readline
    
    """
    다익스트라 알고리즘
    
    -변수-
    dp: 최종 비용을 저장해둠
    heap: 가중치를 계산하기위해 사용하는 힙
    graph: 입력으로 주어지는 그래프를 저장 [다음 노드, 다음 가중치]
    
    """
    
    INF = sys.maxsize
    V, E = map(int,input().split())
    K = int(input())
    graph = [[] for i in range(V+1)]
    dp = [INF] * (V+1)
    heap = []
    
    #경로
    for i in range(E):
        u, v, w = map(int,input().split())
        graph[u].append((w, v))
    
    def dijkstra(start):
        dp[start] = 0
        heapq.heappush(heap, (0, start))
    
        while heap:
            cur_w, cur_node = heapq.heappop(heap)
    
            #최단거리가 아니면 넘어감
            if dp[cur_node] < cur_w:
                continue
    
            for w, next_node in graph[cur_node]:
                next_w = cur_w + w
    
                #더 짧은 거리라면, 새로 바꾸고 heap에 추가
                if next_w < dp[next_node]:
                    dp[next_node] = next_w
                    heapq.heappush(heap, (next_w, next_node))
    
    dijkstra(K)
    for i in dp[1:]:
        print(i if i != INF else "INF")
    68376 708

     

    '백준 > 문제풀이_python' 카테고리의 다른 글

    11866 요세푸스 문제 0 python  (0) 2023.01.07
    1916 최소비용 구하기  (0) 2023.01.07
    1780 종이의 개수  (0) 2023.01.04
    1992 쿼드트리 python  (0) 2023.01.04
    2630 색종이 만들기  (0) 2023.01.04

    댓글