티스토리 뷰

728x90
반응형

문제 요약

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

문제풀이

   이번에는 문제 유형은 그래프 탐색중에 다익스트라 알고리즘 문제이다. 다익스트라 알고리즘 기본적인것을 묻기 때문에 자세한 설명은 여기서 참조하면된다. 

문제 접근 방법

 이번문제는 1 → N까지 최단 경로를 구하는 알고리즘인데 조건이 중간에 2개 노드를 지나가야 한다는 점이다. 중간에 2개의 노드를 지나가야 하는데 나올수 있는 경우의 수는 2가지 이다.

  1. 1 → v1 → v2 → N
  2. 1 → v2 → v1 → N

위 2가지 경우의 수중 최소값만 출력하면 끝이다. 어떻게 풀어야 할지 알았으면 마지막은 구현이다. 구현하는 방법은 1 부터 중간 노드까지 다익스트라 알고리즘으로 구현하고 중간 노드부터 N까지 다익스트라 알고리즘을 구해서 더하기만 된다.

이번 문제도 다익스트라 알고리즘 구현만 할줄 알면 풀이와 구현 방법은 쉽기 때문에 자세하게는 설명 안하겠다.

Code

Python

import sys, heapq
input = sys.stdin.readline
INF = 1e9

def dijkstra(start, end):
    distances = [INF] * (N + 1)
    distances[start] = 0
    queue = [(0, start)]

    while queue:
        now_distance, now_node = heapq.heappop(queue)
        if now_distance > distances[now_node]: continue
        for node, weight in grape[now_node]:
            distance = now_distance + weight

            if distances[node] > distance:
                distances[node] = distance
                heapq.heappush(queue, (distance, node))

    return distances[end]


N, M = map(int, input().split())    
grape = {i: [] for i in range(1, N + 1)}


for _ in range(M):
    a, b, T = map(int, input().split())
    grape[a].append([b, T])
    grape[b].append([a, T])


v1, v2 = map(int, input().split())

result = min(dijkstra(1, v1) + dijkstra(v1, v2) + dijkstra(v2, N), dijkstra(1, v2) + dijkstra(v2, v1) + dijkstra(v1, N))

print(result if result < INF else -1)
728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함