문제
https://www.acmicpc.net/problem/1507
1507번: 궁금한 민호
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 각각의 도시 사이에 이동하는데 필요한 시간이 주어진다. A에서 B로 가는 시간과 B에서 A로 가는 시간은 같다. 또, A와 B
www.acmicpc.net
문제 풀이
입력으로 모든 도시로 가는 최소 이동 시간이 주어져 이를 역으로 풀어야 합니다. 즉, 플로이드 워셜 알고리즘을 역으로 적용하는 문제입니다.
2022.08.01 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 플로이드 워셜(Floyd Warshall) 알고리즘
[파이썬으로 배우는 알고리즘] 플로이드 워셜(Floyd Warshall) 알고리즘
플로이드 워셜(Floyd Warshall) 알고리즘이란? 플로이드 워셜(Floyd Warshall) 알고리즘은 최단 경로 알고리즘이지만 그래프에서 특정한 노드에서 다른 모든 노드까지의 최단 경로를 구하는 다익스트라
c4u-rdav.tistory.com
만약 주어진 입력에서 도시 c1에서 도시 c2로 가는 시간이 t1이고, 도시 c1, c2로 갈 때 도시 c3를 거쳐가는 시간이 t2일 때, t1이 t2보다 크면 이는 입력이 플로이드 워셜 알고리즘이 성립하지 않음을 의미하기 때문에 불가능한 경우로 -1을 출력합니다.
만약 t1과 t2가 같다면, 다른 경로를 통해 연결되어 있다는 뜻으로 직접 연결된 도로는 필요하지 않게 되기 때문에 도로 정보를 지웁니다.
구현
코드
import sys
input = sys.stdin.readline
if __name__ == "__main__":
N = int(input())
a = [list(map(int, input().split())) for _ in range(N)]
# 도로 정보 처음엔 다 가능하도록 초기화
a_check = [[True] * N for _ in range(N)]
for i in range(N):
for j in range(N):
for k in range(N):
if i == j or j == k or i == k:
continue
# 거쳐가는 시간보다 더 크면 플로이드 워셜 알고리즘 성립 x
elif a[i][j] > a[i][k] + a[k][j]:
print(-1)
exit()
# 직접 연결된 도로 정보 삭제 다른 경로를 통해 이미 연결되어있음
elif a[i][j] == a[i][k] + a[k][j]:
a_check[i][j] = False
res = 0
for i in range(N):
for j in range(i+1, N):
# 도로 정보가 있는 것만 누적
if a_check[i][j]:
res += a[i][j]
print(res)
결과
'PS > 백준' 카테고리의 다른 글
[백준(BOJ)] #10026- 적록색약 (파이썬, Python3) (0) | 2022.11.15 |
---|---|
[백준(BOJ)] #2014- 소수의 곱 (파이썬, PyPy3) (0) | 2022.11.12 |
[백준(BOJ)] #1561- 놀이 공원 (파이썬, PyPy3) (0) | 2022.11.09 |
[백준(BOJ)] #1562- 계단 수 (파이썬, PyPy3) (0) | 2022.11.08 |
[백준(BOJ)] #10844- 쉬운 계단 수 (파이썬, PyPy3) (0) | 2022.11.07 |