중량제한

다익스트라 알고리즘에 대해 알아보았다.🌈

CODE

import heapq
import sys
read = sys.stdin.readline
n, m = map(int, read().split())

bridge = list(dict() for _ in range(n+1))
for _ in range(m):
    a, b, c = map(int, read().split())
    if b in bridge[a]:
        bridge[a][b] = max(bridge[a][b], c)
    else:
        bridge[a][b] = c
    if a in bridge[b]:
        bridge[b][a] = max(bridge[b][a], c)
    else:
        bridge[b][a] = c

fac1, fac2 = map(int, read().split())

dp = list(0 for _ in range(n+1))
dp[fac1] = 2147000000
dp[0] = -1

save = []
heapq.heappush(save, [-2147000000, fac1]) #최대힙 사용

while save:
    w, p = heapq.heappop(save)
    if p == fac2:
        break
    w = -w
    for p_new in bridge[p]:
        w_new = bridge[p][p_new]
        if dp[p_new] < min(dp[p], w_new):
            dp[p_new] = min(dp[p], w_new)
            heapq.heappush(save, [-dp[p_new], p_new])
print(dp[fac2])


스티커

소가 길을 건너간 이유7을 풀다가 너무 오래걸릴거 같아서 가벼운 dp문제로 풀었다. 오랜만에 첫 제출에 정답이어서 속시원했다.

CODE

import sys
read=sys.stdin.readline

for _ in range(int(read())):
    n=int(read())
    num=list(list(map(int,read().split())) for _ in range(2))
    dp=list([0,0,0] for _ in range(n))
    dp[0]=[num[0][0],num[1][0],0]

    for i in range(1,n):
        dp[i]=[
            max(dp[i-1][1]+num[0][i],
            dp[i-1][2]+num[0][i]),max(dp[i-1][0]+num[1][i],
            dp[i-1][2]+num[1][i]),max(dp[i-1][0],dp[i-1][1])
        ]
    print(max(dp[-1]))


풀어야 할 문제

  • 스타트 택시
  • 미네랄
  • 아기 상어
  • 전깃줄 -2
  • 치즈
  • 소가 길을 건너간 이유