import sys
from collections import defaultdict
def input():
return sys.stdin.readline().rstrip()
def path(s,e):
if next_node[s][e] == None:
return [0]
else:
result = [s]
while s != e:
s = next_node[s][e]
result.append(s)
return result
N = int(input())
M = int(input())
INF = float('inf')
distance_list = [[0 if i==j else INF for j in range(N+1)] for i in range(N+1)]
next_node = [[None for _ in range(N+1)] for _ in range(N+1)]
graph = [{} for _ in range(N+1)]
for _ in range(M):
x,y,pay = map(int,input().split())
if distance_list[x][y] > pay:
distance_list[x][y] = pay
next_node[x][y] = y
for mid in range(1,N+1):
for start in range(1,N+1):
for end in range(1,N+1):
if distance_list[start][end] > distance_list[start][mid] + distance_list[mid][end]:
distance_list[start][end] = distance_list[start][mid] + distance_list[mid][end]
next_node[start][end] = next_node[start][mid]
for i in range(1,N+1):
print(*[val if val != INF else 0 for val in distance_list[i][1:]])
for start in range(1,N+1):
for ends in range(1,N+1):
if distance_list[start][ends] == INF:
print(0)
else:
answer = path(start,ends)
if len(answer) == 1:
print(0)
else:
print(len(answer),*answer)
플로이드 와샬을 이용해서 풀어야하는데
여기서 중요한 점은 이동지점을 추적해야한다.
그 방법은 start-> end까지 갈때 들리는 노드를 갱신을 해주는 것이다.
a->b로 갈때 b로 간다고 저장을 해놨을때
중간에 값을 갱신한 mid가 있으면
a->b에 b가 아닌 mid를 저장해준다.
이렇게 함으로서
end_node가 동일한 것이 나올때까지 계속 반복을 해주면 되는 것이다.
플로이드 와샬은 자주 사용했지만, 경로를 구해본적은 처음이여서 힘들었다.
이 부분은 외우고 나중에 사용할 수 있도록 노력해야겠다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 14391 종이 조각 (0) | 2021.09.02 |
---|---|
[BOJ/백준] 13418 학교 탐방하기 (0) | 2021.09.02 |
[BOJ/백준] 7511 소셜 네트워킹 어플리케이션 (0) | 2021.09.02 |
[BOJ/백준] 5430 AC (0) | 2021.09.02 |
[BOJ/백준] 4095 최대 정사각형 (0) | 2021.09.02 |