[알고리즘] 다익스트라 - 백준 18352 1446 1916 5972 13549 17396
알고리즘
2023. 3. 14. 14:59
최단 거리 알고리즘
18352 특정 거리의 도시 찾기
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
N, M, K, X = map(int, input().split())
graph = [[] for _ in range(N+1)]
distance = [INF] * (N+1)
for _ in range(M):
a, b = map(int, input().split())
graph[a].append((b, 1))
def dijk(start): # 시작 노드 넣으면
q = []
heapq.heappush(q, (0, start)) # 힙큐에 스타트 노드 넣고
distance[start] = 0 # 당연히 거리는 0
while q: # 큐가 안비어있으면
dist, now = heapq.heappop(q) # 거리랑 현재 노드 뽑아
if distance[now] < dist: # 현재 노드 거리가 < 거리
continue # 넘겨
for j in graph[now]: # 그래프[현재노드]
cost = dist + j[1] # 비용은 거리에다 비용 더해
if cost < distance[j[0]]: # 코스트가 거리보다 적으면
distance[j[0]] = cost # 비용
heapq.heappush(q, (cost, j[0])) # 집어넣어 큐에
dijk(X)
answer = []
for i in range(1, N+1):
if distance[i] == K:
answer.append(i)
if len(answer) == 0:
print(-1)
else:
for x in answer:
print(x)
1446 지름길
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
N, D = map(int, input().split())
graph = [[] for _ in range(D+1)]
distance = [INF]*(D+1)
def dijk(start):
q = []
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
a, b = heapq.heappop(q)
if distance[b] < a:
continue
for j in graph[b]:
cost = a + j[1]
if cost < distance[j[0]]:
distance[j[0]] = cost
heapq.heappush(q, (cost, j[0]))
for i in range(D):
graph[i].append((i+1, 1))
for _ in range(N):
s, d, l = map(int, input().split())
if d > D:
continue
graph[s].append((d, l))
dijk(0)
print(distance[D])
1916 최소비용 구하기
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
N = int(input())
M = int(input())
graph = [[] for _ in range(N+1)]
cost = [INF] * (N+1)
for _ in range(M):
s, d, c = map(int, input().split())
graph[s].append((d, c))
start, end = map(int, input().split())
def dijk(x):
q = []
heapq.heappush(q, (x, 0))
cost[x] = 0
while q:
a, b = heapq.heappop(q)
if cost[a] < b:
continue
for l, r in graph[a]:
ds = b + r
if cost[l] > ds:
heapq.heappush(q, (l, ds))
cost[l] = ds
dijk(start)
print(cost[end])
5972 택배 배송
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
N, M = map(int, input().split())
graph = [[] for _ in range(N+1)]
distance = [INF] * (N+1)
for _ in range(M):
a, b, c = map(int, input().split())
graph[a].append((b,c))
graph[b].append((a,c))
def dijk(start):
q = []
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
dijk(1)
print(distance[-1])
13549 숨바꼭질 3
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
N, K = map(int, input().split())
dp = [INF] * 100001
def dijk(n, k):
q = []
if k <= n:
print(n-k)
return
heapq.heappush(q, [0, n])
while q:
a, b = heapq.heappop(q)
for dx in [b+1, b-1, b*2]:
if 0 <= dx <= 100000:
if dx == b*2 and dp[dx] == INF:
dp[dx] = a
heapq.heappush(q, [a, dx])
elif dp[dx] == INF:
dp[dx] = a + 1
heapq.heappush(q, [a+1, dx])
print(dp[k])
dijk(N, K)
17396 백도어
import sys
import heapq
INF = sys.maxsize
input = sys.stdin.readline
N, M = map(int, input().split())
see = list(map(int, input().split()))
see[-1] = 0
graph = [[] for _ in range(N)]
for i in range(M):
a,b,c = map(int, input().split())
graph[a].append((b, c))
graph[b].append((a, c))
q = []
heapq.heappush(q, (0, 0))
dp = [INF for _ in range(N)]
dp[0] = 0
while q:
w, n = heapq.heappop(q)
if dp[n] < w:
continue
else:
for nx, nw in graph[n]:
cost = nw + w
if dp[nx] > cost and see[nx] == 0:
dp[nx] = cost
heapq.heappush(q, (cost, nx))
print(dp[N-1] if dp[N-1] < INF else -1)
다익은 패턴이 있는 것 같다.
'알고리즘' 카테고리의 다른 글
[알고리즘] BFS - 백준 2589 2636 5427 9205 13913 17836 (0) | 2023.03.16 |
---|---|
[알고리즘] 플로이드 - 백준 11403 1389 11404 2458 1956 14938 (0) | 2023.03.15 |
[알고리즘] 정렬 - 백준 1181 3273 2075 11497 2170 (0) | 2023.03.06 |
[알고리즘] DFS/BFS - 백준 2644 4963 2667 7562 16234 (0) | 2023.03.06 |
[알고리즘] 그리디 - 백준 1789 1449 11501 15903 2112 (0) | 2023.03.05 |