💡문제접근
- 다익스트라 알고리즘과 플로이드-워셜 알고리즘 두 가지 알고리즘 중 플로이드-워셜 알고리즘을 선택했고 모든 정점에서 각각의 정점으로 갈 수 있는 최단거리를 2차원 리스트에 저장했다.
- 그런 다음 for문을 이용해서
1 ~ N
번까지의 각각의 발화 경우를 모두 비교하여 어떤 점에서 불을 붙여야 모든 간선이 빠르게 타는지를 구하면 된다.
💡코드(메모리 : 34324KB, 시간 : 2784ms)
import sys
input = sys.stdin.readline
INF = int(1e9)
N, M = map(int, input().strip().split())
graph = [[INF] * (N+1) for _ in range(N+1)]
edges = []
for _ in range(M):
S, E, L = map(int, input().strip().split())
edges.append([S, E, L])
if graph[S][E] > L:
graph[S][E] = L
graph[E][S] = L
for k in range(1, N + 1):
graph[k][k] = 0
for a in range(1, N + 1):
for b in range(1, N + 1):
if graph[a][b] > graph[k][a] + graph[k][b]:
graph[a][b] = graph[k][a] + graph[k][b]
ans = INF
for i in range(1, N+1):
cur = 0
for edge in edges:
S, E, L = edge
tmp = (L + graph[i][S] + graph[i][E]) / 2
if tmp > cur:
cur = tmp
if cur < ans:
ans = cur
print(ans)
💡소요시간 : 2h 17m