π‘solutions
π¬ heap μ΅μν μλ£κ΅¬μ‘°λ₯Ό νμ©νμ¬ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μΌλ‘ ν΄κ²°νμλ€.
π¬ λ¨Όμ Nλͺ μ νμλ€λ§λ€ Xλ² λ§μμ μ볡μΌλ‘ λ€λ μ€λλ° κ±Έλ¦¬λ μ΅μ μκ°μ ꡬνλ€. -> μ΄λ νΈλκ° μλκΈ° λλ¬Έμ μ΅μ μκ°μ dijkstra(i, x) + dijkstra(x, i)μΌλ‘ β iλ² νμμ΄ λ³ΈμΈμ λ§μμμ Xλ² λ§μλ‘ κ°λ μ΅μ μκ°κ³Ό β‘ Xλ² λ§μμμ μΆλ°νμ¬ λ³ΈμΈ λ§μλ‘ λμμ€λ λ° κ±Έλ¦¬λ μ΅μ μκ°μ λνλ©΄ λλ€.
π¬ λ§μ§λ§μΌλ‘ κ° νμλ€μ΄ Xλ² λ§μμ λ€λ μ€λλ° κ±Έλ¦° μ΅μ μκ°μ λΉκ΅νμ¬ κ°μ₯ λ§μ μκ°μ μλΉν νμμ μμμκ°μ μΆλ ₯νλ©΄ λλ€.
π¨π»code
import heapq
import sys
def dijkstra(start, end):
distance = [INF] * (n+1)
hq = [(0, start)]
distance[start] = 0
while hq:
dist, now = heapq.heappop(hq)
if distance[now] < dist:
continue
for cost, node in adj[now]:
if distance[node] > cost + dist:
distance[node] = cost + dist
heapq.heappush(hq, (cost + dist, node))
return distance[end]
input = sys.stdin.readline
n, m, x = map(int, input().split())
adj = [[] for _ in range(n+1)]
INF = float('inf')
for _ in range(m):
a, b, c = map(int, input().split())
adj[a].append((c, b))
answer = 0
for i in range(1, n+1):
result = dijkstra(i, x) + dijkstra(x, i)
if answer < result:
answer = result
print(answer)
πdescription
λ¬Έμ
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λͺ μ νμλ€ μ€ μ€κ³ κ°λλ° κ°μ₯ μ€λ 걸리λ νμμ μμμκ°μ μΆλ ₯νλ€.