๋ฌธ์
https://www.acmicpc.net/problem/23286
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x1C๊ฐ - ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ
์๊ณ ๋ฆฌ์ฆ: ๊ทธ๋ํ ์ด๋ก , ์ต๋จ ๊ฒฝ๋ก, ๋ฐ์ดํฌ์คํธ๋ผ, ํ๋ก์ด๋-์์
ํ์ด

์ถ๋ฐ๋
ธ๋๋ฅผ A, ๋์ฐฉ๋
ธ๋๋ฅผ B๋ผ ํ์๋ A์์ B๋ก ๊ฐ๋ ๊ฒฝ๋ก๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ๋ ๊ฒ์ด๋ค.
๊ฐ ๊ฒฝ๋ก(A-K-B)์์ ๊ฐ์ฅ ๋์ ํ๋ค์ h๋ผ ํ์๋, h1, h2, h3... ์ค ๊ฐ์ฅ ์์ ๊ฐ์ด A-B ๊ฒฝ๋ก์ ๊ฐ์ด ๋๋๊ฒ์ด๋ค.
๋ง์ฝ graph[A][K]์ ๋์ด๊ฐ 3, graph[K][B]์ ๋์ด๊ฐ 6์ด๋ผ๋ฉด A-K-B์ ๊ฒฝ๋ก๋ 6์ด ๋๋ค.
์ด๋ฐ์์ผ๋ก ๋ชจ๋ ์ ์ K๋ฅผ ์ค๊ฐ ๋
ธ๋๋ก ๋๊ณ ๊ฐ ๊ฒฝ๋ก๋ง๋ค ๊ฐ์ฅ ๋์ ํ๋ค์ ์ฒดํฌํ๋ค.
(๊ธฐ์กด graph[A][B]๊ฐ์ด 4๋ผ๋ฉด 4 < 6์ด๋ ๊ฐฑ์ ํ์ง ์๊ณ ๊ทธ๋๋ก ๋๋ ์.)
์ฐธ๊ณ ๋ก ์ด ๋ฌธ์ ... ์์ ์ ํ๋ก์ด๋์์
+ Python3๋ก ์ ์ถํ์๋๋ ์๊ฐ์ด๊ณผ ํ์ ์ ๋ฐ์๋ค.
ํ์ด๊ธ์ ์์ฑํ๋ฉฐ ์ข ๋ ๋ค๋ฌ์ด์ ๋ค์ ์ ์ถํด๋ณด๋ ํต๊ณผ๋๋ค. ๊ธฐ์ค์ด ์ํ๋๋ฏ?
ํ์ง๋ง ๋ค์ต์คํธ๋ผ๋ฅผ ์ฌ์ฉํ๋ ํ์ด๋ณด๋ค๋ ๋๋ฆฌ๋ค. ์ฌ์ค ์ด ๋ฌธ์ ๋ ๋ค์ต์คํธ๋ผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋น ๋ฅธ ์๊ฐ์ผ๋ก ํต๊ณผํ ์ ์๋ค!
(ํ๋ก์ด๋ ์์
์ฌ์ฉ์: 2056ms / ๋ค์ต์คํธ๋ผ ์ฌ์ฉ์: 600ms)

๋ฌธ์ ์์ฒด๋ ํ๋ก์ด๋ ์์
์ ํ์ด์ง๋ง, ๋
ธ๋๋ ์ต๋ 300๊ฐ๊ฐ ์ฃผ์ด์ง ์ ์๋ ๋ฐ๋ฉด์ ๊ฐ์ ์ ์ต๋ 25,000๊ฐ๋ง ์ฃผ์ด์ง๋ค.
๋ชจ๋ ๋
ธ๋๊ฐ ์ด์ด์ ธ์๋ค๊ณ ๊ฐ์ ํ์๋์ ๊ฐ์ ์๋ 90,000๊ฐ ์ด๋ฏ๋ก ์ค์ ๋ณด๋ค ํจ์ฌ ์ ์ ๊ฐ์ด ์ฃผ์ด์ง๋ ์
์ด๋ค.
1. ๋ค์ต์คํธ๋ผ ์ฌ์ฉ ํ์ด (heapq)
์ผ๋จ ๊ฐ์ ์ ๋ณด ์ ์ฅ / ๊ณ์ฐ๊ฐ ๊ฐฑ์ ์ ๋ถ๋ฆฌํด์ผํ๋ค.
๋๋ ๊ฐ์ ์ ๋ณด ์ ์ฅ์ 2์ฐจ์ ๋์
๋๋ฆฌ({a: {b: h}})๋ฅผ, ๊ฐฑ์ ์ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ ๋ค ๋ฆฌ์คํธ๋ก ๊ด๋ฆฌํด๋ ์๊ด์ ์์ง๋ง ์์์ ๋งํ๋ค์ํผ ๊ฐ์ ๊ฐฏ์๋ ๋
ธ๋ ์์ ๋นํด ์ ์ผ๋ฏ๋ก ๋์
๋๋ฆฌ๋ฅผ ํ์ฉํ๋๊ฒ ๋ ํจ์จ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋
ธ๋๋ฅผ ์์์ ์ผ๋ก ๋๋ฉฐ ๋ค์ต์คํธ๋ผ๋ฅผ ์คํํ๋ค. ์ด๊ธฐ ํ(์ต์ํ)์๋ (0, ์์๋
ธ๋)๊ฐ ๋ค์ด์๋ค.
ํ์ด ๋น ๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
(graph = ์ด๊ธฐ ๊ฐ์ ๊ฐ / heights = A-B ํ๋ค ๋์ด ๊ณ์ฐ๊ฐ)
(๋์ด, ๋ ธ๋)๋ฅผ ํ์์ ๊บผ๋ธ๋ค.- ๋ง์ฝ ๊บผ๋ธ ๋์ด๊ฐ์ด
heights[์์์ ][๋ ธ๋]๋ณด๋ค ํฌ๋ค๋ฉด, ์ด๋ฏธ ํ์ธํ ๋ ธ๋์ด๋ฏ๋ก ๋์ด๊ฐ๋ค. - ์๋๋ผ๋ฉด ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ค์ ํ์ธํ๋ค.
- ํ์ฌ ๋
ธ๋์์ ๊ฐ ์ ์๋ ๋
ธ๋๋ฅผ
nxt๋ผ๊ณ ํ์๋,graph[๋ ธ๋][nxt]๊ฐ๊ณผ ํ์ฌ ๋์ด ๊ฐ์ ๋น๊ตํ๋ค. - ๋ ์ค ๋ ํฐ๊ฐ์ ์ต๋ ํ๋ค ๋์ด๋ก ์ ์ . (์ต๋ ํ๋ค ๋์ด)
- ๋ง์ฝ ์ด ๊ฐ์ด ๊ธฐ์กด์
heights[์์๋ ธ๋][nxt]๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ฐฑ์ , ํ์ ์ถ๊ฐ. (์ต์๊ฐ)
- ํ์ฌ ๋
ธ๋์์ ๊ฐ ์ ์๋ ๋
ธ๋๋ฅผ
ํ์ ๋ค์ด์๋ ๋์ด๊ฐ์ ์์์ ์์ ํ์ฌ ๋
ธ๋๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๋ค ์ค์์ "๊ฐ์ฅ ๋์ ํ๋ค"์ ์๋ฏธํ๋ค.
ํ์ง๋ง ์ต์ ํ์ ์ ์ฅํ์ผ๋ pop๋๋ ๊ฐ์ ์ฌ๋ฌ๊ฐ์ ์์๋
ธ๋ → ํ์ฌ๋
ธ๋ ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ์ต์์ ์ต๋ ํ๋ค ๋์ด๊ฐ์ด ๋๋๊ฒ์ด๋ค.
๊ฐ์ ๋
ธ๋์ ๋๋ฌํ๋๋ผ๋ ์ด๋ค ๊ฒฝ๋ก๋ก ์๋๋์ ๋ฐ๋ผ ์ต๋ ํ๋ค ๋์ด๊ฐ ๋ฌ๋ผ์ง๋๊ฑฐ๋ค.popํ ๋์ด๊ฐ๊ณผ nxt ์ฌ์ด์ ํ๋ค ๋์ด๊ฐ์ ๋น๊ตํด์ ๋ ๋์ ํ๋ค์ new_h๋ก ๊ฒฐ์ ํ๊ณ , ์ด ๊ฐ์ด ๊ธฐ์กด์ ์์๋
ธ๋ → nxt ๊ฒฝ๋ก์ ๋์ด๊ฐ๋ณด๋ค ์์ผ๋ฉด ๊ฐฑ์ ํ๋๊ฒ!
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 37452KB / ์๊ฐ: 600ms
from sys import stdin
from collections import defaultdict
from heapq import heappop, heappush
input = stdin.readline
INF = int(1e9)
N, M, T = map(int, input().split())
# 2์ฐจ์ ๋์
๋๋ฆฌ ์์ฑ
# graph[a][b] = {a: {b: ํ๋ค ๋์ด}}
graph = defaultdict(dict)
for _ in range(M):
u, v, h = map(int, input().split())
graph[u][v] = h
def dijkstra(start):
queue = []
heappush(queue, (0, start))
while queue:
curr_h, curr = heappop(queue)
if heights[start][curr] < curr_h:
continue
for nxt, h in graph[curr].items():
new_h = max(h, curr_h)
if new_h < heights[start][nxt]:
heights[start][nxt] = new_h
heappush(queue, (new_h, nxt))
heights = [[INF] * (N+1) for _ in range(N+1)]
# ๋ค์ต์คํธ๋ผ๋ก ๋ชจ๋ ๋
ธ๋๋ฅผ ์์์ ์ผ๋ก ๋๊ณ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
for i in range(1, N+1):
heights[i][i] = 0
dijkstra(i)
for _ in range(T):
s, e = map(int, input().split())
ret = heights[s][e]
print(ret if ret != INF else -1)
2. ํ๋ก์ด๋-์์ ์ฌ์ฉ ํ์ด
ํ๋ก์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๊ต์ ๊ฐ๋จํด์ง๋ค.
k-i-j๋ก ํ๋ก์ด๋ ์์
์ ์ํํ๋ฉด์ ํ์ํ ์กฐ๊ฑด๋ง ์ฒดํฌํด์ฃผ๋ฉด ๋๋ค.
graph[i][k]์graph[k][j]์ ๊ฐ์ดINF์ธ์ง ํ์ธํ๋ค.INF๋ผ๋ฉด ๋ถ๊ฐ๋ฅํ ๊ฒฝ๋ก์ด๋ฏ๋ก ๋์ด๊ฐ.
graph[i][k]์ ํ๋ค ๋์ด,graph[k][j]์ ํ๋ค ๋์ด ์ค ๋ ํฐ ๊ฐ์ ์ ํ. (์ต๋ ํ๋ค ๋์ด)- ๋ง์ฝ ์ด ๊ฐ์ด ๊ธฐ์กด์
graph[i][j]๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ฐฑ์ ํ๋ค. (์ต์๊ฐ)
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 33432KB / ์๊ฐ: 2056ms
from sys import stdin
input = stdin.readline
INF = int(1e9)
def main():
N, M, T = map(int, input().split())
graph = [[INF if i != j else 0 for j in range(N)] for i in range(N)]
for _ in range(M):
u, v, h = map(int, input().split())
graph[u-1][v-1] = h
for k in range(N):
for i in range(N):
for j in range(N):
if graph[i][k] == INF or graph[k][j] == INF:
continue
# i-k ๊ฒฝ๋ก์ ํ๋ค๊ณผ k-j ๊ฒฝ๋ก์ ํ๋ค ์ค ๋ ๋์๊ฐ
max_h = max(graph[i][k], graph[k][j])
if graph[i][j] > max_h:
graph[i][j] = max_h
for _ in range(T):
s, e = map(int, input().split())
print(graph[s-1][e-1] if graph[s-1][e-1] != INF else -1)
main()
๊ทธ๋๋ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฌ์ด๊ฑด ํ๋ก์ด๋ ์์ ์ด๋ค. (ํํ)