백준 1916번 python 풀이 - 최소비용 구하기
문제 링크
해결책
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
32
33
34
35
36
37
38
39
import sys
INF = 999999999
N = int(sys.stdin.readline().rstrip())
M = int(sys.stdin.readline().rstrip())
path = [[INF for _ in range(N+1)]for _ in range(N+1)]
for _ in range(M):
_from, _to, _weight = map(int, sys.stdin.readline().rstrip().split())
if path[_from][_to] != INF:
path[_from][_to] = min(path[_from][_to], _weight)
else:
path[_from][_to] = _weight
_from, _to = map(int, sys.stdin.readline().rstrip().split())
def dajixtra(_from, _to):
dist_list = []
for i in range(1, len(path[_from])):
if i != _from:
dist_list.append((path[_from][i], i))
while dist_list:
dist_list.sort(key=lambda x: x[0])
cur_val, cur_idx = dist_list.pop(0)
path[_from][cur_idx] = min(path[_from][cur_idx], cur_val)
cur_val = path[_from][cur_idx]
for i in range(len(dist_list)):
dist_val, dist_idx = dist_list[i]
dist_list[i] = (min(dist_val, cur_val + path[cur_idx][dist_idx]), dist_idx)
dajixtra(_from, _to)
print(path[_from][_to])
주석으로 달 설명
어젯 밤에 풀기는 했지만, 내가 정확히 이해했는지 확인하기 위해 다시 풀었다. 우선순위 큐로 해결할 수도 있고(지금의 dist_list를 우선순위큐로 교체하면 된다) 이에 익숙하지 않아 일단 리스트와 sort lambda식을 이용해서 해결해보았다.
This post is licensed under CC BY 4.0 by the author.