728x90
반응형
https://www.acmicpc.net/problem/1504
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
정답 code
#특정한 최단 경로
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
def dijkstra(start):
visit = [INF]*(n+1)
q = []
heapq.heappush(q,(0,start))
visit[start] = 0
while q:
dis, node = heapq.heappop(q)
if visit[node]>= dis:
for node_index, node_time in graph[node]:
time = node_time + dis
if visit[node_index]> time:
visit[node_index] = time
heapq.heappush(q,(time,node_index))
return visit
n,m = map(int,input().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
a,b,c = map(int,input().split())
graph[a].append((b,c))
graph[b].append((a,c))
v1,v2 = map(int,input().split())
one = dijkstra(1)
v1_ = dijkstra(v1)
v2_ = dijkstra(v2)
# 1번에서 v1, v2를 거쳐 n으로 가는경우, 1번에서 v2, v1을 거쳐 n으로 가는경우
total = min(one[v1]+v1_[v2]+v2_[n], one[v2]+v2_[v1]+v1_[n])
print(total if total < INF else -1)
solution
앞서 풀었던 1238번과 거의 유사한 문제라 다익스트라를 이용해 쉽게 해결 할 수 있었다.
다만 신경 써야되는 부분은 v1과 v2를 거쳐 가야됨으로 다익스트라를 이용해 v1 과 v2의 최단 거리들도 구해서 해결해야 한다.
1번에서 n으로 주어진 v1,v2를 거쳐가는 경우는 두가지다.
1. 1번에서 v1,v2순으로 방문한다음 n 방문
2. 1번에서 v2,v1순으로 방문한다음 n 방문
이 둘중 최솟 값을 출력해주면 된다.
728x90
반응형
'알고리즘 > 백준[baekjoon]' 카테고리의 다른 글
[baekjoon] 백준 1753번 : 최단경로 (by python 파이썬) 다익스트라 dijkstra (0) | 2022.08.19 |
---|---|
[baekjoon] 백준 1629번 : 곱셈 (by python 파이썬) 수학, DAC(분할정복) (0) | 2022.08.19 |
[baekjoon] 백준 1238번 : 파티 (by python 파이썬) 다익스트라 최단경로, heapq (0) | 2022.08.16 |
[baekjoon] 백준 1167번 : 트리의 지름 (by python 파이썬) bfs, tree (0) | 2022.08.16 |
[baekjoon] 백준 1149번 : RGB거리 (by python 파이썬) DP 다이나믹 프로그래밍 (0) | 2022.08.14 |