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

ํ๋ก์ด๋ ์์ ์ ์ด์ฉํด ์๋ณต์๊ฐ์ ๊ณ์ฐํ๋ ๋ฌธ์ ๋ค.
๋ฌธ์ ์ค๋ช
์ "์ต๋๊ฐ ์ต์"๋ผ๊ณ ๋์ด์๋๋ฐ, ์ฝ๊ฐ ๋ถ์น์ ํ ์ค๋ช
์ธ๋ฏ...
์คํ์ด์ ์น๊ตฌ๋ค์ ๋ชจ๋ ๋ค๋ฅธ ๋ง์์ ์ด๊ณ ์๋ค.
๋ฐ๋ผ์ ์ด๋ค ๋ง์ A์ ๋ํ ์๋ณต์๊ฐ์ ๋ชจ๋ ๋ค๋ฅด๋ค.
๋ง์ฝ A ๋ง์์ ์๋ณต์๊ฐ์ด [100, 10, 90, 110] ์ผ๊ฒฝ์ฐ, A ๋ง์์ ๋ํ ์๋ณต์๊ฐ์ 110์ด ๋๋ค. (์ต๋)
์ ๊ณผ์ ์ ๋ฐ๋ณตํด์ 1 ~ N ๋ง์์ ์ต๋ ์๋ณต์๊ฐ ๋ฆฌ์คํธ๊ฐ [110, 90, 200, 100, 90]์ด ๋์์๋, X๊ฐ ๋ ์ ์๋ ๋ง์์ 2๋ฒ, 5๋ฒ ๋ง์์ด๋ค. (์ต์)
์ฐธ๊ณ ๋ก ์ฒ์ ํ์ดํ ๋๋ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ ๋ง์์ ์๋ณต์๊ฐ๋ค์ ์ ์ฅํ์๊ณ , ๋ค์ ํ์ดํ ๋๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์คํ์๊ฐ์ด ๊ฝค ์ฐจ์ด๋๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 33432KB / ์๊ฐ: 924ms
from sys import stdin
input = stdin.readline
INF = int(1e9)
def main():
def floyd_warshall(graph: list) -> list:
for k in range(N):
for i in range(N):
for j in range(N):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
return graph
def calc() -> list[int]:
""" X๊ฐ ๋ ์ ์๋ ๋ง์ ํ๋ณด๋ค ๊ตฌํ๊ธฐ """
min_time = INF # ์ต์ ์๋ณต์๊ฐ
towns = [] # X๊ฐ ๋ ์ ์๋ ๋ง์๋ค
# ์ต๋๊ฐ ์ต์ = X๊น์ง ๊ฐ๋ ์๋ณต์๊ฐ ์ค ์ต๋๊ฐ์ด, ๋ค๋ฅธ ๋ง์๋ก ๊ฐ๋ ์๋ณต์๊ฐ๋ค ์ค ์ต์๊ฐ์ธ๊ฒฝ์ฐ.
for X in range(N):
time = 0 # ํ์ฌ ๋ง์ ๊ธฐ์ค ์ต๋ ์๋ณต์๊ฐ
for curr in C:
curr_time = graph[curr][X] + graph[X][curr]
if curr_time == INF:
break
time = max(time, curr_time)
# ๋ง์ฝ ๋ค๋ฅธ ๋ง์ ์๋ณต์๊ฐ๋ณด๋ค ์๋ค๋ฉด, ์ต์๊ฐ๊ณผ town ๋ฆฌ์คํธ ๊ฐฑ์ .
# ๊ฐ๋ค๋ฉด town ๋ฆฌ์คํธ์ ํ์ฌ ๋ง์ ์ถ๊ฐ
if time < min_time:
towns = [X]
min_time = time
elif time == min_time:
towns.append(X)
return towns
N, M = map(int, input().split())
graph = [[INF] * N for _ in range(N)]
for i in range(N):
graph[i][i] = 0
for _ in range(M):
A, B, T = map(int, input().split())
graph[A-1][B-1] = T
K = int(input())
C = list(map(lambda x: int(x)-1, input().split()))
graph = floyd_warshall(graph)
towns = calc()
print(" ".join(map(lambda x: str(x+1), towns)))
main()