문제
알고리즘
- 처음에 dfs를 통해 문제를 해결하려 했지만 문제 이름과 같이 플로이드 문제였다.
- 반복문을 통해 경로를 확인하고 한 번에 가는 경우와 중간에 거쳐서 가는 경우를 비교/계산한다.
코드
import sys
n = int(sys.stdin.readline())
m = int(sys.stdin.readline())
graph = [[1e9 for _ in range(n + 1)] for _ in range(n + 1)]
# 자기 자신으로 오는 경우는 x
for _ in range(n + 1): graph[_][_] = 0
# 반복문을 통해 그래프를 표시
for _ in range(m):
s, e, c = map(int, sys.stdin.readline().split())
if graph[s][e] > c:
graph[s][e] = c
# 반복문을 통해 경로 확인
for i in range(1, n + 1):
for j in range(1, n + 1):
for k in range(1, n + 1):
# 자기 자신으로 오는 경우는 x
if j == k:
graph[j][k] = 0
# j -> k 로 가는 경우와 j -> i -> k 로 가는 경우중 비용이 적게드는 것을 확인
else:
graph[j][k] = min(graph[j][k], graph[j][i] + graph[i][k])
# 반복문을 통해 출력
for a in range(1, n + 1):
for b in range(1, n + 1):
if graph[a][b] == 1e9:
print(0, end=" ")
else:
print(graph[a][b], end=" ")
print()
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 14499번(파이썬): 주사위 굴리기 (0) | 2022.06.21 |
---|---|
[baekjoon] 백준 1197번(파이썬): 최소 스패닝 트리 (0) | 2022.06.20 |
[baekjoon] 백준 2580번(파이썬): 스도쿠 (1) | 2022.06.18 |
[baekjoon] 백준 6593번(파이썬): 상범 빌딩 (0) | 2022.06.17 |
[baekjoon] 백준 5582번(파이썬): 공통 부분 문자열 (0) | 2022.06.16 |