๋ฌธ์
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 ๊ฐ๊ณผ ๋์ผํ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
'์๊ณ ๋ฆฌ์ฆ > ๊ทธ๋ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 6087 ๐ฅ] ๋ ์ด์ ํต์ (0) | 2023.08.24 |
---|---|
[๋ฐฑ์ค 14940 ๐ฅ] ์ฌ์ด ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2023.08.20 |
[์ํํฐ์ด level 3] ์ถํด๊ทผ๊ธธ (0) | 2023.08.09 |
[๋ฐฑ์ค 2468 ๐ฅ] ์์ ์์ญ (0) | 2023.08.08 |
[๋ฐฑ์ค 17025 ๐ฅ] Icy Perimeter (0) | 2023.07.27 |