플로이드 워셜. 최솟값이 최솟값끼리의 합이면 0 (direct한 경로가 아니라는 뜻)
최솟값끼리의 합보다 주어진 값이 크면? 최솟값이 아니라는 뜻. -1 출력.
import sys
input = sys.stdin.readline
n = int(input())
matrix = [list(map(int, input().split())) for _ in range(n)]
edge = [[1] * n for _ in range(n)]
result = 0
for k in range(n):
for i in range(n):
for j in range(n):
if i == j or j == k or i == k:
continue
# 합으로 표현되면 취하지 않는다.(그게 경로라는뜻)
if matrix[i][j] == matrix[i][k] + matrix[k][j]:
edge[i][j] = 0
# 큰게 하나라도 있으면 불가능한 그래프.
elif matrix[i][j] > matrix[i][k] + matrix[k][j]:
result = -1
if result != -1:
for i in range(n):
for j in range(i, n):
if edge[i][j]:
result += matrix[i][j]
print(result)
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 6568 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다. (0) | 2021.09.10 |
---|---|
[백준][Python] 17951 흩날리는 시험지속에서 내 평점이 느껴진거야 (0) | 2021.09.08 |
[백준][Python] 16202 MST게임 (0) | 2021.09.08 |
[백준][Python] 5568 카드놓기 (0) | 2021.09.08 |
[백준][Python] 10000 원 영역 (0) | 2021.09.08 |