https://github.com/Dev-Guccin
Guccin
https://github.com/Dev-Guccin
전체 방문자
오늘
어제
  • 분류 전체보기 (172)
    • 알고리즘 (140)
    • 삽질방지 (13)
    • SystemHacking (1)
    • 일상 (4)
    • 개발 (8)
    • 스프링 부트 REST API 개발일지 (5)
    • JPA (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • DFS
  • 다이나믹 프로그래밍
  • 최소힙
  • 백트래킹
  • 12015
  • LIS
  • MST
  • 재귀함수
  • 이분탐색
  • 최단경로
  • 유니온 파인드
  • 스택
  • DP
  • 다이나믹프로그래밍
  • python3
  • 재귀
  • 다익스트라
  • 그리디
  • counter
  • 최대공약수
  • Python
  • 큐
  • 그래프
  • 백준
  • 이분 탐색
  • 유클리드호제법
  • 파이썬
  • heapq
  • 프로그래머스
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
https://github.com/Dev-Guccin

Guccin

[python3] 백준 1916 풀이 ( 최소비용 구하기, 다익스트라, 그래프 )
알고리즘

[python3] 백준 1916 풀이 ( 최소비용 구하기, 다익스트라, 그래프 )

2021. 8. 19. 22:00

문제를 읽어보면 한 도시에서 다른 도시까지 가는데에 걸리는 최소 비용을 구하는 문제이다. 
최소 비용알고리즘은 대표적으로 다익스트라, 벨만-포드, 플로이드-워샬이 존재한다.
이 문제에서는 시작 정점이 주어지기 때문에 단일 시작점 알고리즘인 다익스트라와 벨만-포드를 사용할 수 있다. (시간제한이 0.5초라서 플로이드-워샬을 사용하면 시간초과 날것임.)
추가적으로, 음수 가중치가 나오지 않으므로 다익스트라를 사용해서 문제를 풀면 된다.

다익스트라 알고리즘을 사용해야한다는 것을 알면 문제 풀이가 어렵지는 않다.
일반적으로 쓰이는 다익스트라 알고리즘을 적용하여 풀이하면 된다.

다익스트라를 간단히 설명하자면 플로이드-워샬처럼 INF로 초기화 시키고 dp를 갱신하며 최솟값을 찾아내는 것이다. 다만 플로이드-워샬은 모든 중간지점을 돌며 모든 경우의 수를 확인한다. 그러나 다익스트라는 출발점이 정해진 상태에서 해당되는 것만 갱신하기 때문에 시간복잡도가 훨씬 작다.

'''
모든 쌍 최단거리인줄 알고, 플로이드 워샬로 구하려고 했는데
시간제한이 0.5라서 단일 시작점알고리즘이란걸 알게됨.
단일 시작점은 다익스트라와 벨만-포드가 존재함.
음수 가중치 없으니 다익으로 ㄱㄱㅆ
다익스트라-> pq사용
'''
import heapq
import sys
input = sys.stdin.readline
N = int(input())
M = int(input())
INF = 2100000000
adj = [[] for i in range(N+1)]

for _ in range(M):
    a,b,c = map(int, input().split())
    adj[a].append([b,c])

start,final = map(int, input().split())

# 메모이제이션 배열 선언
dp = [INF for i in range(N+1)]
dp[start] = 0
# 우선순위큐 선언
pq = []
heapq.heappush(pq, [0,start])

while pq:
    cost,mid = heapq.heappop(pq)
    if dp[mid] < cost:
        continue
    for end, endcost in adj[mid]:
        if dp[end] > cost+endcost:
            dp[end] = cost+endcost
            heapq.heappush(pq, [dp[end],end])
print(dp[final])

 

결론: heapq는 자체가 최소힙이다. 고만 까먹자. 

저작자표시

'알고리즘' 카테고리의 다른 글

[python3] 프로그래머스 징검다리 풀이 ( 이분탐색 )  (0) 2021.08.22
코딩테스트 알고리즘별 전략 및 요약 (수정 중...)  (0) 2021.08.20
[python3] 백준 1389 풀이 ( 케빈 베이컨의 6단계 법칙, 플로이드 워샬 )  (0) 2021.08.18
[python3] 프로그래머스 입국심사 풀이 ( 이분 탐색 )  (0) 2021.08.17
[python3] 백준 14360 풀이 ( 구슬 탈출 2, BFS, 방문체크 없음 )  (0) 2021.08.13
    '알고리즘' 카테고리의 다른 글
    • [python3] 프로그래머스 징검다리 풀이 ( 이분탐색 )
    • 코딩테스트 알고리즘별 전략 및 요약 (수정 중...)
    • [python3] 백준 1389 풀이 ( 케빈 베이컨의 6단계 법칙, 플로이드 워샬 )
    • [python3] 프로그래머스 입국심사 풀이 ( 이분 탐색 )
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin

    티스토리툴바