λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ 문제 풀이/Shortest Path

[μ΄μ½”ν…Œ]전보

by syLim___ 2023. 2. 27.
728x90

좜처: 이것이 취업을 μœ„ν•œ μ½”λ”©ν…ŒμŠ€νŠΈλ‹€ with 파이썬

https://www.youtube.com/watch?v=acqm9mM1P6o&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=7

 

문제

  • μ–΄λ–€ λ‚˜λΌμ—λŠ” N개의 λ„μ‹œκ°€ μžˆλ‹€. 그리고 각 λ„μ‹œλŠ” λ³΄λ‚΄κ³ μž ν•˜λŠ” λ©”μ‹œμ§€κ°€ μžˆλŠ” 경우, λ‹€λ₯Έ λ„μ‹œλ‘œ 전보λ₯Ό λ³΄λ‚΄μ„œ λ‹€λ₯Έ λ„μ‹œλ‘œ ν•΄λ‹Ή λ©”μ‹œμ§€λ₯Ό 전솑할 수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ XλΌλŠ” λ„μ‹œμ—μ„œ Y라느 γ„΄λ„μ‹œλ‘œ 전보λ₯Ό λ³΄λ‚΄κ³ μž ν•œλ‹€λ©΄, λ„μ‹œ Xμ—μ„œ Y둜 ν–₯ν•˜λŠ” ν†΅λ‘œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ Xμ—μ„œ Y둜 ν–₯ν•˜λŠ” ν†΅λ‘œλŠ” μžˆμ§€λ§Œ, Yμ—μ„œ X둜 ν–₯ν•˜λŠ” ν†΅λ‘œκ°€ μ—†λ‹€λ©΄ YλŠ” X둜 λ©”μ‹œμ§€λ₯Ό 보낼 수 μ—†λ‹€. λ˜ν•œ ν†΅λ‘œλ₯Ό 거쳐 λ©”μ‹œμ§€λ₯Ό 보낼 λ•ŒλŠ” 일정 μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.
  • μ–΄λŠ λ‚  CλΌλŠ” λ„μ‹œμ—μ„œ μœ„κΈ‰ 상황이 λ°œμƒν–ˆλ‹€. κ·Έλž˜μ„œ μ΅œλŒ€ν•œ λ§Žμ€ λ„μ‹œλ‘œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ³ μž ν•œλ‹€. λ©”μ‹œμ§€λŠ” λ„μ‹œ Cμ—μ„œ μΆœλ°œν•˜μ—¬ 각 λ„μ‹œ 사이에 μ„€μΉ˜λœ ν†΅λ‘œλ₯Ό 거쳐, μ΅œλŒ€ν•œ 많이 νΌμ Έλ‚˜κ°ˆ 것이닀.
  • 각 λ„μ‹œμ˜ λ²ˆν˜Έμ™€ ν†΅λ‘œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆλŠ” 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, λ„μ‹œ Cμ—μ„œ 보낸 λ©”μ‹œμ§€λ₯Ό λ°›κ²Œ λ˜λŠ” λ„μ‹œμ˜ κ°œμˆ˜λŠ” 총 λͺ‡ 개이며 λ„μ‹œλ“€μ΄ λͺ¨λ‘ λ©”μ‹œμ§€λ₯Ό λ°›λŠ” λ°κΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ μ–Όλ§ˆμΈμ§€ κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

문제 쑰건

  • 풀이 μ‹œκ°„: 60λΆ„
  • μ‹œκ°„μ œν•œ: 1초
  • λ©”λͺ¨λ¦¬ μ œν•œ: 128MB
  • μž…λ ₯ 쑰건:

  • 좜λ ₯ 쑰건: 첫째 쀄에 λ„μ‹œ Cμ—μ„œ 보낸 λ©”μ‹œμ§€λ₯Ό λ°›λŠ” λ„μ‹œμ˜ 총 κ°œμˆ˜μ™€ 총 κ±Έλ¦¬λŠ” μ‹œκ°„μ„ 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ 좜λ ₯ν•œλ‹€.


λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 좜발점 cλ‘œλΆ€ν„° 각각의 λ…Έλ“œκΉŒμ§€μ˜ μ΅œλ‹¨κ²½λ‘œλ₯Ό λͺ¨λ‘ κ΅¬ν•œλ‹€.

μ΄λ•Œ μž…λ ₯κ°’μœΌλ‘œ μ£Όμ–΄μ§„ nκ³Ό m이 맀우 큰 수이기 λ•Œλ¬Έμ—, μš°μ„ μˆœμœ„νμ™€ νž™μ„ ν™œμš©ν•œλ‹€!!

 

μ΅œλ‹¨κ²½λ‘œλ₯Ό λͺ¨λ‘ κ΅¬ν•œ ν›„, 도달할 수 μžˆλŠ” λ…Έλ“œμ˜ κ°œμˆ˜μ™€ 그쀑 μ΅œλŒ€ μ†Œμš” μ‹œκ°„μ„ ꡬ해 좜λ ₯ν•œλ‹€.

import sys
import heapq
INF = int(1e9) 
input = sys.stdin.readline



#λ„μ‹œμ˜ 개수, ν†΅λ‘œμ˜ 개수, 좜발점
n, m, c = map(int, input().split())

graph = [[] for i in range(n+1)]
cost = [INF] * (n+1)

for _ in range(m):
  x,y,z = map(int,input().split())
  #xμ—μ„œ y둜 κ°€λŠ” λΉ„μš©μ΄ z
  graph[x].append((y,z))

def dijkstra(c):
    q=[]
    heapq.heappush(q,(0,c))
    cost[c] = 0
    while q:
      curCost, now = heapq.heappop(q)
      if cost[now]<curCost:
        continue
      for i in graph[now]:
        sum = curCost+i[1]
        if sum < cost[i[0]]:
          cost[i[0]]=sum
          heapq.heappush(q,(curCost,i[0]))


dijkstra(c)

cnt=0 #도달 κ°€λŠ₯ν•œ λ…Έλ“œ 개수
result=0 #μ΅œλŒ€μ†Œμš”μ‹œκ°„
for i in range(1,n+1):
  if cost[i]==0: #μ‹œμž‘λ…Έλ“œλ©΄ μ œμ™Έ
    continue
  if cost[i]!=INF:
    cnt += 1
    result = max(result, cost[i])
    
print(cnt,result)
728x90