๐๋ฌธ์ ํ์ํ๊ธฐ
- XX์ฐ์ n๊ฐ์ ์ง์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ฐ ์ง์ ์ 1๋ถํฐ n๊น์ง ๋ฒํธ๊ฐ ๋ถ์ด์์ผ๋ฉฐ, ์ถ์ ๊ตฌ, ์ผํฐ, ํน์ ๋ด์ฐ๋ฆฌ
- ๊ฐ ์ง์ ์ ์๋ฐฉํฅ ํตํ์ด ๊ฐ๋ฅํ๋ฉฐ ์ด๋ํ๋๋ฐ ์ผ์ ์๊ฐ์ด ์์๋๋ ๋ฑ์ฐ๋ก๋ก ์ฐ๊ฒฐ๋์ด ์์
- ๋ฑ์ฐ์ฝ์ค๋ ๋ฐฉ๋ฌธํ ์ง์ ๋ฒํธ๋ค์ ์์๋๋ก ๋์ดํ์ฌ ํํ
- ๋ฑ์ฐ์ฝ์ค๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ ์ค ์ผํฐ ํน์ ์ฐ๋ด์ฐ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ํด์์ ์ทจํ ์ ์์
- ํด์ ์์ด ์ด๋ํด์ผ ํ๋ ์๊ฐ ์ค ๊ฐ์ฅ ๊ธด ์๊ฐ = ํด๋น ๋ฑ์ฐ์ฝ์ค์ intensity
- XX์ฐ์ ์ถ์
๊ตฌ ์ค ํ ๊ณณ์์ ์ถ๋ฐํ์ฌ ์ฐ๋ด์ค๋ฆฌ ์ค ํ ๊ณณ๋ง ๋ฐฉ๋ฌธํ ๋ค ๋ค์ ์๋ ์ถ์
๊ตฌ๋ก ๋์์ค๋ ๋ฑ์ฐ์ฝ์ค๋ฅผ ์ ํ๋ ค๊ณ ํจ
- ์ถ์ ๊ตฌ๋ ์ฒ์๊ณผ ๋์ ํ ๋ฒ์ฉ, ์ฐ๋ด์ฐ๋ฆฌ๋ ํ ๋ฒ๋ง ํฌํจ
- intensity๊ฐ ์ต์๊ฐ ๋๋๋ก ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ
๋งค๊ฐ ๋ณ์
- ์ง์ ์ ๊ฐ์ n, ์ถ์ ๊ตฌ ์ง์ ๋ฐฐ์ด gates, ์ฐ๋ด์ฐ๋ฆฌ ์ง์ ๋ฐฐ์ด summits
์ ํ ์ฌํญ
- 2 ≤ n ≤ 50,000
- n-1 ≤ paths์ ๊ธธ์ด ≤ 200,000
- paths์ ์์: [i, j, w]์ ํํ (i, j๋ฒ ์ง์ ์ ์ฐ๊ฒฐํ๊ณ , ์ด๋ํ๋ ๋ฐ w๋งํผ ์์๋๋ ๋ฑ์ฐ๋ก๊ฐ ์์)
- 1 ≤ i < j ≤ n
- 1 ≤ w ≤ 10,000,000
- ์๋ก ๋ค๋ฅธ ๋ ์ง์ ์ ์ง์ ์ฐ๊ฒฐํ๋ ๋ฑ์ฐ๋ก๋ ์ต๋ 1๊ฐ
- 1 ≤ gates์ ๊ธธ์ด ≤ n
- 1 ≤ gates์ ์์ ≤ n
- gates์ ์์๋ ํด๋น ์ง์ ์ด ์ถ์ ๊ตฌ์์ ๋ํ๋
- 1 ≤ summits์ ๊ธธ์ด ≤ n
- 1 ≤ summits์ ์์ ≤ n
- summits์ ์์๋ ํด๋น ์ง์ ์ด ์ฐ๋ด์ฐ๋ฆฌ์์ ๋ํ๋
- ์ถ์ ๊ตฌ์ด๋ฉด์ ์ฐ๋ด์ฐ๋ฆฌ์ธ ์ง์ ์์
- gates์ summits์ ๋ฑ์ฅํ์ง ์์ ์ง์ ์ ๋ชจ๋ ์ผํฐ
- ์์์ ๋ ์ง์ ์ฌ์ด์ ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ํญ์ ์กด์ฌํจ
๋ฐํ ๊ฐ
- ๋ฐฐ์ด [์ฐ๋ด์ฐ๋ฆฌ์ ๋ฒํธ, intensity์ ์ต์๊ฐ]
- intensity๊ฐ ์ต์๊ฐ ๋๋ ๋ฑ์ฐ ์ฝ์ค๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๊ทธ์ค ์ฐ๋ด์ฐ๋ฆฌ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ฑ์ฐ์ฝ์ค ์ ํํ๊ธฐ
ํ์ด ๋ฐฉ๋ฒ ์๊ฐํด๋ณด๊ธฐ
์ฐ์ ์ฐ๋ด์ฐ๋ฆฌ์ ๋์ฐฉ๋งํ๋ฉด, ์๋ ๊ฒฝ๋ก ๊ทธ๋๋ก ๋๋์์ค๋ ๊ฒ์ ์๊ด์์ผ๋ฏ๋ก ์ถ์ ๊ตฌ์์ ์ฐ๋ด์ฐ๋ฆฌ๊น์ง ๊ฐ๋ ๊ฒ๋ง ๊ณ ๋ คํ๋ฉด ๋๋ค. ๊ฐ ์ถ์ ๊ตฌ์์ ์ถ๋ฐํด์ ๋ค๋ฅธ ์ถ์ ๊ตฌ๋ฅผ ๊ฑฐ์น์ง ์๋๋ก ํ๋ฉด์, ๋ค์ต์คํธ๋ผ ๋ฐฉ์์ผ๋ก ๋ค๋ฅธ ๋ ธ๋๊น์ง์ ์ต intensity๋ฅผ ๊ฐฑ์ ํด ๋๊ฐ๋ฉฐ ํ์ํ๋ฉด ๊ฒฐ๊ตญ ๋ชจ๋ ๋ ธ๋๊น์ง์ intensity๋ฅผ ๊ตฌํ ์ ์๋ค. ์ด๋ฅผ ํ ๋๋ก ์ฐ๋ด์ฐ๋ฆฌ๊น์ง์ ๊ฐ์ฅ ์ต์ intensity์ ๊ทธ ์ฐ๋ด์ฐ๋ฆฌ์ ๋ฒํธ๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- ๋ฑ์ฐ๋ก ์ ๋ณด๋ฅผ ์ ์ฅํ ์ธ์ ๋ฆฌ์คํธ graph๋ฅผ ์์ฑํ๊ณ , paths ๋ฆฌ์คํธ๋ฅผ ํ ๋๋ก ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค.
- i๋ฒ์งธ ์ง์ ์ด ์ถ์ ๊ตฌ ํน์ ๊ฒ์ดํธ์ธ์ง ์ฝ๊ฒ ์๊ฒ ํ๊ธฐ ์ํด is_gate, is_summit ๋ฆฌ์คํธ๋ฅผ ์์ฑํด ๋ชจ๋ ์์๋ฅผ False๋ก ์ด๊ธฐํํ๊ณ , gates์ summits์ ํ ๋๋ก ํด๋น ์ง์ ๋ง True๋ก ๋ฐ๊ฟ์ค๋ค.
- ๊ฐ ์ง์ ๊น์ง์ ํ์ฌ ์ต์ intensity๋ฅผ ๊ด๋ฆฌํ ๋ฆฌ์คํธ intensity๋ฅผ ์์ฑํ๊ณ ๋ชจ๋ ์์๋ฅผ ๋ฌดํ๋๋ก ์ด๊ธฐํํ๋ค.
- ๊ฐ ํ์ ๋จ๊ณ์์ intensity๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ ธ๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ํํ๊ธฐ ์ํด ์ฐ์ ์์ํ hq๋ฅผ ์์ฑํ๋ค.
- gates๋ฅผ ํ ๋๋ก ๊ฐ ์ถ์ ๊ตฌ์ intensity๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๊ณ , hq์ (0, ์ถ์ ๊ตฌ ๋ฒํธ)๋ฅผ heappushํ๋ค.
- hq๊ฐ ๋น ๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- hq์์ heappop์ ํตํด (ํ์ฌ intensity, ํ์ฌ ๋ ธ๋)๋ฅผ ๊บผ๋ธ๋ค.
- ๋ง์ฝ ํ์ฌ intensity ๊ฐ์ด intenisity ๋ฆฌ์คํธ์ ๊ธฐ๋ก๋ ํ์ฌ ๋ ธ๋๊น์ง์ ์ต์ intensity ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด ํ์ํ ํ์๊ฐ ์์ผ๋ฏ๋ก continue.
- ๋ง์ฝ ํ์ฌ ๋ ธ๋๊ฐ summit์ด๋ผ๋ฉด ๋ ๊ฒฝ๋ก๋ฅผ ์ด์ด๊ฐ ํ์๊ฐ ์์ผ๋ฏ๋ก continue
- graph๋ฅผ ํตํด ํ์ฌ ๋ ธ๋์ ์ด์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด์, ํ์ฌ intensity ๊ฐ์ ๋ค์ ๋ ธ๋๊น์ง ๊ฐ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ค ๋ ํฐ ๊ฐ์ ์๋ก์ด intensity ๊ฐ์ผ๋ก ์ค์ ํ๋ค. ๋ค์ ๋ ธ๋๊ฐ ์ถ์ ๊ตฌ๊ฐ ์๋๊ณ , ์๋ก์ด intensity ๊ฐ์ด intensity ๋ฆฌ์คํธ์ ๊ธฐ๋ก๋ ๋ค์ ๋ ธ๋๊น์ง์ ์ต์ intensity ๊ฐ๋ณด๋ค ์๋ค๋ฉด hq์ (์๋ก์ด intensity, ๋ค์ ๋ ธ๋)๋ฅผ heappushํ๋ค.
- summits๋ก ๋ฐ์ ๋ชจ๋ ์ฐ๋ด์ฐ๋ฆฌ๋ฅผ ๋ฒํธ๊ฐ ๋ฎ์ ์์๋๋ก ๋๋ฉด์, ๊ฐ์ฅ intensity๊ฐ ๋ฎ์ ์ฐ๋ด์ฐ๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
- 7์์ ์ฐพ์ ์ฐ๋ด์ฐ๋ฆฌ ๋ฒํธ์ ํด๋น ์ฐ๋ด์ฐ๋ฆฌ๊น์ง์ intensity๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํํ๋ค.
๐์๋ํ์ฐจ ์์ ์ฌํญ
1ํ์ฐจ
์ ์ฝ๋ ์ค๊ณํ๊ธฐ ๊ณผ์ ์ 4~6๋ฒ ๊ณผ์ ์ ํจ์๋ก ๋ง๋ค์ด ์ถ์ ๊ตฌ๋ค๋ง๋ค ํด๋น ํจ์๋ฅผ ํธ์ถํด์ ๊ฐ ์ถ์ ๊ตฌ์์ ์ถ๋ฐํ์ ๋ ์ต์ intenstity๋ฅผ ์ฐพ๊ณ ์ ํ๋ค. ๊ทธ ๊ณผ์ ์์ ์ด๋ฏธ ์ต์ intensity๋ฅผ ์ฐพ์์์๋ ์ค๋ณต์ผ๋ก ํ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํด์ ์ผ๋ถ ํ ์คํธ์ผ์ด์ค์์ ์๊ฐ์ด๊ณผ๋ฅผ ๋ฐ์๋ค.
์ถ์ ๊ตฌ๋ง๋ค ํ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด ์๋๋ผ, ํ ๋ฒ์ ๋ค์ต์คํธ๋ผ ์คํ์ผ๋ก ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋๋ก ์์ ํ๋ค.
๐์ ๋ต ์ฝ๋
from collections import deque
from heapq import heappush, heappop
def solution(n, paths, gates, summits):
INF = int(1e8)
graph = [[] for _ in range(n+1)]
for i, j, w in paths:
graph[i].append((j, w))
graph[j].append((i, w))
is_gate = [False]*(n+1)
is_summit = [False]*(n+1)
for g in gates:
is_gate[g] = True
for s in summits:
is_summit[s] = True
intensity = [INF]*(n+1)
hq = []
for g in gates:
intensity[g] = 0
heappush(hq, (0, g))
while hq:
cur_intensity, cur_node = heappop(hq)
if cur_intensity > intensity[cur_node]:
continue
if is_summit[cur_node]:
continue
for next_node, next_intensity in graph[cur_node]:
next_intensity = max(cur_intensity, next_intensity)
if not is_gate[next_node] and next_intensity < intensity[next_node]:
intensity[next_node] = next_intensity
heappush(hq, (next_intensity, next_node))
summits.sort()
answer = [0, INF]
for s in summits:
if intensity[s] < answer[1]:
answer = [s, intensity[s]]
return answer