practivceAlgorithm/백준
[백준][Python] 1507 궁금한 민호
findTheValue
2021. 9. 8. 18:12
플로이드 워셜. 최솟값이 최솟값끼리의 합이면 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)