์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ทธ๋ž˜ํ”„

[๋ฐฑ์ค€ 1238 ๐Ÿฅ‡] ํŒŒํ‹ฐ

1eehyunji 2023. 8. 15. 00:49

๋ฌธ์ œ

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 ๊ฐ’๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.