문제
https://www.acmicpc.net/problem/1916
1916번: 최소비용 구하기
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그
www.acmicpc.net
About Problem
문제의 핵심은 저 두줄이다. 간선의 정보를 주고 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 구하는 것이다.
간선의 비용이 양수이며 다르고 최소 비용을 구하는 알고리즘은 다익스트라 알고리즘이다.
간선의 최단경로를 구하는 알고리즘은 다음과 같다
Code
코드 설명은 코드 주석으로 적었다.
from sys import stdin
import heapq
# input 받기
N = int(stdin.readline())
M = int(stdin.readline())
# index를 이용해서 간선의 위치를 파악 할수 있게 해주는 list만들기
lst = [[] for _ in range(N+1)]
# 최소비용을 찾는거기 때문에 각 위치까지 도착할 비용을 최대로 잡기
inf = int(1e9)
cost_lst = [inf] * (N+1)
# 출발 index에 [도착, cost]를 append 하기
for i in range(M):
S, E, C = list(map(int, stdin.readline().split()))
lst[S].append([E, C])
# 출발지, 도착지 받아오기
s, e = map(int, stdin.readline().split())
# 출발지는 비용이 0이므로 0으로 만들어주고, Q에 (비용, 출발지) 리스트로 넣기
cost_lst[s] = 0
Q = [(0, s)]
# 다익스트라
while Q:
# 현 위치까지 오는데 비용, 현 위치
c, n = heapq.heappop(Q)
# heapq를 쓰기 때문에 이전에 방문했던 곳이면 pass
if cost_lst[n] == c:
# lst안에 들어있는 갈수있는곳과 cost 파악하기
for go, cost in lst[n]:
now_cost = cost_lst[n] + cost
# 갈곳의 비용이 계산한 비용보다 클 때에만 가게하기
if cost_lst[go] > now_cost:
cost_lst[go] = now_cost
heapq.heappush(Q, (now_cost, go))
print(cost_lst[e])
'알고리즘 > 알고리즘 공부(python)' 카테고리의 다른 글
프로그래머스_양궁대회/Using Python 파이썬 (0) | 2022.06.23 |
---|---|
백준_2458_키순서/Using_Python_파이썬 (0) | 2022.06.21 |
프로그래머스_배달/Using python 파이썬 (0) | 2022.06.21 |
BAEKJOON 19238 스타트 택시 Using Python (0) | 2022.06.16 |
백준(BAEKJOON) 1654 랜선 자르기 using Python (0) | 2022.06.16 |