import sys import heapq def distra(start,ind): distance[ind][start] = 0 node_list = [] heapq.heappush(node_list,(0,start)) while node_list: dis,node = heapq.heappop(node_list) if dis > distance[ind][node]: continue for next_node in graph[node]: if distance[ind][next_node] > dis + graph[node][next_node]: distance[ind][next_node] = dis + graph[node][next_node] heapq.heappush(node_list,(distance[ind][next_node],next_node)) input = sys.stdin.readline N, E = map(int,input().split()) graph = [{} for i in range(N+1)] for _ in range(E): A,B,C = map(int,input().split()) graph[A][B] = C graph[B][A] = C ess = list(map(int,input().split())) INF = float('inf') distance = [[INF]*(N+1) for _ in range(3)] distra(1,0) distra(N,1) distra(ess[0],2) a = distance[0][ess[0]] + distance[1][ess[1]] + distance[2][ess[1]] b = distance[0][ess[1]] + distance[1][ess[0]] + distance[2][ess[1]] result = min(a,b) if result == INF: print(-1) else: print(result)
이 문제는 다익스트라를 이용해서 푸는 문제이다. 대신 입력으로 주어진 두 정점을 무조건 통과 해야하는 문제였다.
그렇기 때문에 두가지 경로로 가능하다고 생각했다.
시작점 : 1번노드 / 도착점 : N번노드 경유노드 : A,B번 노드
라고 하겠다.
1번노드 ->A번노드 -> B번노드 -> N번노드
1번노드 ->B번노드 -> A번노드 -> N번노드
라고 생각했다.
이 두 가지 경로에 대해서 구하고, 둘중의 최저값이 정답이 된다.
이걸 한번에 구하기 위해, 총 3번의 다익스트라를 해주었다.
distance라는 2차원 배열을 만들어두고, 열은 전체 distance를 넣어주는 역할을 하고,
0번 행은 1번노드에서의 다익스트라
1번 행은 N번 노드에서의 다익스트라
2번 행은 A번 노드에서의 다익스트라
가 저장되게 해놓았다.
그래서 각각의 경로에 맞게 더해주기만 하면 되고,
만약 최저값이 INF로 나올시, A,B번 노드를 동시에 통과하는 경우는 없는 것이므로, -1을 출력하도록 했다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 5052 전화번호 목록 (0) | 2021.03.11 |
---|---|
[BOJ/백준] 1963 소수 경로 (0) | 2021.03.11 |
[BOJ/백준] 15685 드래곤 커브 (0) | 2021.03.08 |
[BOJ/백준] 2096 내려가기 (0) | 2021.03.08 |
[BOJ/백준] 1922 네트워크 연결 (0) | 2021.03.08 |