Skip to content

Commit a0f4de7

Browse files
authored
[BOJ] 1504 특정한 최단 경로 (G4)
1 parent 90406c9 commit a0f4de7

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

김지호/6주차/260205.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# https://www.acmicpc.net/problem/1504
2+
# 특정한 최단 경로, 골드4
3+
4+
import sys
5+
import copy
6+
from collections import deque, defaultdict
7+
from typing import List
8+
sys.stdin = open('../../../input.txt', 'r')
9+
10+
N, E = map(int,input().split(" ")) # N(정점 개수), E(간선 개수)
11+
12+
# 다익스트라 문제
13+
INF = float('inf')
14+
graph = [[INF] * N for _ in range(N)]
15+
16+
for i in range(N):
17+
graph[i][i] = 0
18+
19+
for _ in range(E):
20+
start,end,dist = map(int,input().split(" "))
21+
graph[start-1][end-1] = dist
22+
graph[end-1][start-1] = dist
23+
24+
# 거쳐야 하는 점들
25+
inputs = list(map(int,input().split(" ")) )
26+
x1 = inputs[0]-1
27+
x2 = inputs[1]-1
28+
29+
# startNode -> endNode
30+
startNode = 1-1
31+
endNode = N-1
32+
33+
# 방문할 수 잇는 노드 중에 제일 가까운 노드
34+
def getMinNode(distance, visited, N):
35+
minNode = -1
36+
minDistance = INF
37+
for i in range(N):
38+
if not visited[i] and minDistance > distance[i]:
39+
minNode = i
40+
minDistance = distance[i]
41+
return minNode
42+
43+
44+
def dijkstra(graph,N,start,end):
45+
visited = [False] * N
46+
distance = graph[start] # 최신 거리
47+
48+
visited[start] = True
49+
50+
for _ in range(N):
51+
node = getMinNode(distance, visited, N)
52+
53+
visited[node] = True
54+
55+
for index, dist in enumerate(graph[node]):
56+
if not visited[index] and distance[index] > distance[node] + dist:
57+
distance[index] = distance[node] + dist
58+
# print(f"{start} > {end} 최단거리 구하기")
59+
# print(distance)
60+
# print()
61+
return distance[end]
62+
63+
# 2가지 거리를 계싼
64+
common = dijkstra(graph,N,x1,x2)
65+
answer1 = dijkstra(graph,N,startNode,x1) + dijkstra(graph,N,x2,endNode)
66+
answer2 = dijkstra(graph,N,startNode,x2) + dijkstra(graph,N,x1,endNode)
67+
68+
answer = min(answer1, answer2) + common
69+
if answer == INF:
70+
print(-1)
71+
else:
72+
print(answer)
73+
# print(common + answer1)
74+
# print(common + answer2)
75+

0 commit comments

Comments
 (0)