알고리즘/Python
[python] 백준 11404 - 플로이드
제주도랏맨
2023. 4. 13. 15:35
출처 : 백준, https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
# n개의 도시 사이를 운행하는 m개의 버스가 있음
# A B C -> A 도시에서 B 도시로 가는 비용 C
# 가격이 다른 동일 노선이 존재할 수 있음.
# 각 도시에서 다른 도시로 가는 최소 비용을 출력
# 갈 수 없을 경우 0 출력
더보기
먼저, 생각해야 할 부분
1. 가격이 다른 동일 노선이 존재할 수 있다.
2. 모든 도시에서 모든 도시로 가는 최소 비용을 구해야한다. -> 플로이드-워셜 알고리즘
3. 갈 수 없을 경우 0을 출력해야한다.
4. 반복문을 통해 많은 입력을 받을 때, input() 함수는 느리다.
시간 초과가 난다면 input() 함수를 사용한건 아닌지 고려해보자.
풀이
import sys
INF = float('inf')
def solution(n, cost_matrix):
for k in range(n):
for i in range(n):
if i == k:
continue
for j in range(n):
if i == j or j == k:
continue
prev_val = cost_matrix[i][j]
next_val = cost_matrix[i][k] + cost_matrix[k][j]
cost_matrix[i][j] = min(prev_val, next_val)
for line in cost_matrix:
for num in line:
print(num if num != INF else 0, end=' ')
print()
n = int(input())
bus = int(input())
cost_matrix = [[INF for j in range(n)] for i in range(n)]
for _ in range(bus):
A, B, cost = map(int, sys.stdin.readline().rstrip().split())
cost_matrix[A - 1][B - 1] = min(cost, cost_matrix[A - 1][B - 1])
solution(n, cost_matrix)
시간 복잡도
O(N^3)
알게 된 점
플로이드-워셜 알고리즘
모든 점으로부터 모든 점으로의 최단 거리를 구할 때는 플로이드-워셜 알고리즘을 사용한다.
Github
GitHub - bh2980/Algorithm-Problem: 알고리즘 풀이 흔적들
알고리즘 풀이 흔적들. Contribute to bh2980/Algorithm-Problem development by creating an account on GitHub.
github.com