[λ°±μ€ 1238 π₯] νν°
λ¬Έμ
Nκ°μ μ«μλ‘ κ΅¬λΆλ κ°κ°μ λ§μμ ν λͺ μ νμμ΄ μ΄κ³ μλ€.
μ΄λ λ μ΄ Nλͺ μ νμμ΄ X (1 ≤ X ≤ N)λ² λ§μμ λͺ¨μ¬μ νν°λ₯Ό λ²μ΄κΈ°λ‘ νλ€. μ΄ λ§μ μ¬μ΄μλ μ΄ Mκ°μ λ¨λ°©ν₯ λλ‘λ€μ΄ μκ³ iλ²μ§Έ κΈΈμ μ§λλλ° Ti(1 ≤ Ti ≤ 100)μ μκ°μ μλΉνλ€.
κ°κ°μ νμλ€μ νν°μ μ°ΈμνκΈ° μν΄ κ±Έμ΄κ°μ λ€μ κ·Έλ€μ λ§μλ‘ λμμμΌ νλ€. νμ§λ§ μ΄ νμλ€μ μλ κ²μλ¬μ μ΅λ¨ μκ°μ μ€κ³ κ°κΈ°λ₯Ό μνλ€.
μ΄ λλ‘λ€μ λ¨λ°©ν₯μ΄κΈ° λλ¬Έμ μλ§ κ·Έλ€μ΄ μ€κ³ κ°λ κΈΈμ΄ λ€λ₯Όμ§λ λͺ¨λ₯Έλ€. Nλͺ μ νμλ€ μ€ μ€κ³ κ°λλ° κ°μ₯ λ§μ μκ°μ μλΉνλ νμμ λꡬμΌμ§ ꡬνμ¬λΌ.
μ λ ₯
첫째 μ€μ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), Xκ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ λ ₯λλ€. λ λ²μ§Έ μ€λΆν° M+1λ²μ§Έ μ€κΉμ§ iλ²μ§Έ λλ‘μ μμμ , λμ , κ·Έλ¦¬κ³ μ΄ λλ‘λ₯Ό μ§λλλ° νμν μμμκ° Tiκ° λ€μ΄μ¨λ€. μμμ κ³Ό λμ μ΄ κ°μ λλ‘λ μμΌλ©°, μμμ κ³Ό ν λμ Aμμ λ€λ₯Έ λμ Bλ‘ κ°λ λλ‘μ κ°μλ μ΅λ 1κ°μ΄λ€.
λͺ¨λ νμλ€μ μ§μμ Xμ κ°μ μκ³ , Xμμ μ§μΌλ‘ λμμ¬ μ μλ λ°μ΄ν°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
첫 λ²μ§Έ μ€μ Nλͺ μ νμλ€ μ€ μ€κ³ κ°λλ° κ°μ₯ μ€λ 걸리λ νμμ μμμκ°μ μΆλ ₯νλ€.

λ¬Έμ νμ΄
import sys
import heapq
n,m,x=map(int, sys.stdin.readline().split(' '))
path=[[] for _ in range(n+1)]
# μλ°©ν₯κ·Έλν
pathR=[[] for _ in range(n+1)]
for _ in range(m):
s,e,t=map(int, sys.stdin.readline().split(' '))
path[s].append((e,t))
pathR[e].append((s,t))
# partyμμ κ° λ§μλ‘ λμκ°λ μ΅λ¨ κ²½λ‘
fromParty=[1e9]*(n+1)
fromParty[x]=0
heap=[]
heapq.heappush(heap, (0,x))
while heap:
time, cur = heapq.heappop(heap)
# μ΄λ―Έ μ²λ¦¬λμ΄ μλ μ§μ μ΄λΌλ©΄ μ¦, μ΄μ μ κ³μ°λ μ΅λ¨ κ²½λ‘κ° νμ¬ μ΄ time κ°λ³΄λ€ μμμ νμ¬ timeμ κ°μ§κ³ λ μ΄μ κ³μ°ν΄ μ€ νμκ° μμ
if time > fromParty[cur]:
continue
for nn,nt in path[cur]:
if fromParty[nn]>time+nt:
fromParty[nn]=time+nt
heapq.heappush(heap, (time+nt, nn))
# κ° λ§μμμ partyλ‘ κ°λ μ΅λ¨ κ²½λ‘
toParty=[1e9]*(n+1)
toParty[x]=0
heapR=[]
heapq.heappush(heapR, (0,x))
while heapR:
time, cur = heapq.heappop(heapR)
# μ΄λ―Έ μ²λ¦¬λμ΄ μλ μ§μ μ΄λΌλ©΄ μ¦, μ΄μ μ κ³μ°λ μ΅λ¨ κ²½λ‘κ° νμ¬ μ΄ time κ°λ³΄λ€ μμμ νμ¬ timeμ κ°μ§κ³ λ μ΄μ κ³μ°ν΄ μ€ νμκ° μμ
if time > toParty[cur]:
continue
for nn,nt in pathR[cur]:
if toParty[nn]>time+nt:
toParty[nn]=time+nt
heapq.heappush(heapR, (time+nt, nn))
ans=-1e9
for i in range(1,n+1):
ans=max(ans, toParty[i]+fromParty[i])
print(ans)
- κ° nλ²μ§Έ λ§μμμ xλ²μ§Έ λ§μλ‘ κ°λ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνκ³ λ°°μ΄μ μ μ₯νλ€. (toParty)
- xλ²μ§Έ λ§μμμ κ° nλ²μ§Έ λ§μλ‘ κ°λ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνκ³ λ°°μ΄μ μ μ₯νλ€. (fromParty)
- λ§μ§λ§μΌλ‘ κ° λ§μμ μμΉλ³λ‘ λ λ°°μ΄μ κ°μ λν κ° μ€ κ°μ₯ ν° κ°μ μΆλ ₯νλ©΄ λλ€.
- λ¨Όμ , xλ²μ§Έ λ§μμμ nλ²μ§Έ λ§μλ‘ κ°λ μ΅λ¨ κ²½λ‘κ° μ μ₯λ fromPartyλ₯Ό ꡬνλ λ°©μμ μ νμ μΈ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ¬μ©νλ€.
- λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ€λͺ
νμλ©΄ λ€μκ³Ό κ°λ€.
- μΆλ° λ Έλμμ κ° λ Έλλ³λ‘ κ° μ μλ μ΅λ¨ κ²½λ‘λ₯Ό μ μ₯ν λ°°μ΄μ 1e9 κ°μΌλ‘ μ΄κΈ°νν΄μ μ μΈνλ€.
- μ΄ λ°°μ΄μ μΆλ° λ Έλμ ν΄λΉνλ κ°μ 0μΌλ‘ μ΄κΈ°ννκ³ , (0, μΆλ° λ Έλ)λ₯Ό heapμ λ£μ΄μ€λ€.
- μ΄μ heapμ popνλ©΄μ popν λ Έλμ μ°κ²°λ λ Έλμ κ°μ€μΉλ€μ νμνλ€. (heapμ μ¬μ©νκΈ° λλ¬Έμ μ μ₯λ κ° μ€ κ°μ€μΉκ° κ°μ₯ μμ κ°μ΄ μ°μ μ μΌλ‘ popλλ€.)
- νμ κ³Όμ μμ νμ¬ μ΅λ¨ κ²½λ‘λ‘ μ μ₯λ κ°λ³΄λ€ popν κ°μ€μΉ + νμ¬ λ Έλμ μ°κ²°λ λ Έλμμ κ°μ€μΉ κ°μ΄ λ μλ€λ©΄ νμ¬ μ΅λ¨ κ²½λ‘λ₯Ό μ λ°μ΄νΈνλ€.
- μ΄ κ³Όμ μ heapμ μ‘΄μ¬νλ κ°μ΄ μμ λκΉμ§ λ°λ³΅νλ©΄ μΆλ° λ Έλμμ κ° λ Έλλ‘ ν₯νλ μ΅λ¨ κ²½λ‘λ₯Ό ꡬν μ μλ€.
- μ¬κΈ°μ xλ²μ§Έ λ§μμμ κ° nλ²μ§Έ λ§μλ‘ κ°λ μ΅λ¨ κ²½λ‘μΈ fromPartyλ₯Ό ꡬν λλ μ
λ ₯λ°μ κΈ°μ‘΄μ κ²½λ‘λ₯Ό μ¬μ©νλ©΄ λλ€.
- μμ λ₯Ό μλ‘ λ€λ©΄, 2->1, 2->3, 2->4λ‘ κ°λ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνλ κ²μ΄λ€.
- νμ§λ§, κ° nλ²μ§Έ λ§μμμ xλ²μ§Έ λ§μλ‘ κ°λ μ΅λ¨ κ²½λ‘μΈ toPartyλ μ
λ ₯λ°μ κΈ°μ‘΄μ κ²½λ‘λ₯Ό μλ°©ν₯μΌλ‘ μ μ₯ν΄μ ꡬν΄μΌ νλ€.
- μμ λ₯Ό μλ‘ λ€λ©΄, 1->2, 3->2, 4->2λ‘ κ°λ μ΅λ¨ κ²½λ‘λ₯Ό ꡬν΄μΌ νλλ°, μ΄κ²μ κ° λ Έλλ§λ€ λ€μ΅μ€νΈλΌλ₯Ό μ€νν΄μΌ νλ―λ‘ μκ°λ³΅μ‘λκ° μ»€μ§ μ λ°μ μλ€.
- κ·Έλμ κΈ°μ‘΄μ κ²½λ‘λ₯Ό μλ°©ν₯μΌλ‘ μ μ₯ν΄μ λ€μ΅μ€νΈλΌλ₯Ό ν λ²λ§ μ€νν΄μ 2->1, 2->3, 2->4λ₯Ό ꡬνλ€.
- κΈ°μ‘΄μ κ²½λ‘λ‘ ν 1->2, 3->2, 4->2 κ°κ³Ό λμΌν κ°μ κ°μ§κ² λλ€.