Notice
Recent Posts
Recent Comments
Link
리미로그
[baekjoon] 백준 1753번 최단경로 (골드4, python) 본문
https://www.acmicpc.net/problem/1753
2776번: 암기왕
연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,
www.acmicpc.net
하나의 정점으로부터 다른 모든 정점까지의 거리를 구하므로 다익스트라 알고리즘을 사용하였다
다익스트라 알고리즘을 리스트(O(V^2))를 이용해서 간단하게 구현할 수 있지만,
힙을 사용한 우선순위 큐를 통해 구현하게 되면 시간 복잡도가 O(ElogV) 로 줄어든다
우선순위 큐는 우선순위가 가장 높은 데이터를 가장 먼저 삭제하므로 cost가 가장 작은 정점부터 나올 수 있도록 하면 된다
이때 cost와 node를 같이 저장하고 꺼내야 하는데 첫 번째 원소로 정렬되기 때문에 (cost, node) 순으로 큐에 저장해야 한다
import heapq
INF = int(1e9)
v, e = map(int,input().split()) # 정점과 간선 개수
k = int(input()) # 시작 노드
graph = [[] for _ in range(v+1)]
distance = [INF] * (v+1)
for _ in range(e):
a,b,w = map(int,input().split()) # a->b
graph[a].append((w,b))
def dijkstra(start): # 다익스트라 알고리즘
q = []
heapq.heappush(q, (0,start))
distance[start] = 0
while q :
cost, node = heapq.heappop(q)
if cost > distance[node]:
continue
distance[node] = cost
for x in graph[node]: # 정점과 연결되어 있는 정점 중 거리를 줄일 수 있는지 확인
dist = cost + x[0]
if dist < distance[x[1]]:
distance[x[1]] = dist
heapq.heappush(q,(dist,x[1]))
dijkstra(k)
for i in range(1,v+1):
if distance[i] == INF:
print('INF')
else:
print(distance[i])
'algorithm > baekjoon' 카테고리의 다른 글
[baekjoon] 백준 14503번 로봇 청소기 (골드5, java) (0) | 2022.08.06 |
---|---|
[baekjoon] 백준 2776번 암기왕 (실버 4, python) (0) | 2022.07.04 |
Comments