import sys import heapq def dijkstra(flag=False,*arg): distance = [INF for _ in range(N+1)] distance[1] = 0 node_list = [] if flag: remove_node = arg[0] heapq.heappush(node_list,(0,1)) while node_list: cur_dis,node = heapq.heappop(node_list) if cur_dis>distance[node]: continue for next_node in graph[node]: if flag and ((node,next_node) == remove_node or (next_node,node) == remove_node): continue temp_distance = cur_dis + graph[node][next_node] if distance[next_node] > temp_distance: distance[next_node] = temp_distance heapq.heappush(node_list,(temp_distance,next_node)) if not flag: stack = [(N,distance[N])] while stack: node,dis = stack.pop() for prev_node in graph[node]: if (prev_node,node) not in short_list: if distance[prev_node] + graph[prev_node][node] == dis: short_list.add((prev_node,node)) stack.append((prev_node,distance[prev_node])) return distance[N] def input(): return sys.stdin.readline() N,M = map(int,input().split()) graph = [{} for _ in range(N+1)] for _ in range(M): x,y,pay = map(int,input().split()) graph[x][y] = pay graph[y][x] = pay INF = float('inf') short_list = set() short_time = dijkstra() short_list = list(short_list) result = -1 for node in short_list: remove_time = dijkstra(True,node) result = max(result,remove_time - short_time) print(result if result != INF else -1)
문제를 푸는 방식은 다음과 같다.
먼저 다익스트라로 최단 거리를 구한다.
그와 동시에 이동경로를 구해야한다.
즉 우리는 다익스트라를 하면서 누적된 이동거리 리스트를 이용해서 역산을 통해 최단 거리의 이동 경로를 구한다.
이렇게 구한 이동경로를 하나씩 검문을 하는 것이다.
그리고 그 검문을 했을때의 다익스트라를 구하고, 이 때의 최대값을 구하고, 지연된 시간을 구하면 된다.
이 문제는 다익스트라를 통해 이동경로를 추적하고, 그 이동경로를 활용해서 풀 수 있는 문제였다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 3687 성냥개비 (0) | 2021.07.31 |
---|---|
[BOJ/백준] 2613 숫자구슬 (0) | 2021.07.31 |
[BOJ/백준] 2211 네트워크 복구 (0) | 2021.07.31 |
[BOJ/백준] 1944 복제 로봇 (0) | 2021.07.31 |
[BOJ/백준] 16724 피리 부는 사나이 (0) | 2021.07.15 |