알고리즘 문제 풀이/이코테

이코테 플로이드 워셜 알고리즘

파란색 가운 2023. 7. 4. 14:42
import sys
import heapq
from sys import stdin
from collections import deque
sys.setrecursionlimit(10 ** 8)
sys.stdin.readline 
import sys
from sys import stdin
from collections import deque
sys.setrecursionlimit(10 ** 8)
sys.stdin.readline 
INF = int(1e9)

N = int(input())
M = int(input())
graph = [[INF] * (N+1) for _ in range(N+1)]

for i in range(1,N+1):
    for j in range(1,N+1):
        if i == j:
            graph[i][j] = 0

for _ in range(M):
    a,b,c = map(int,sys.stdin.readline().split())
    graph[a][b] = c

for k in range(1,N+1):
    for a in range(1,N+1):
        for b in range(1,N+1):
            graph[a][b] = min(graph[a][b],graph[a][k]+graph[k][b])
        
for i in range(1,N+1):
    for j in range(1,N+1):
        if graph[i][j] == INF:
            print("INFINITY")
        else:
            print(graph[i][j],end = " ")
    print()

다이나믹 프로그래밍과 매우 유사하다. a->b 와 a->k->b를 비교하여 최솟값 찾기

O(N^3)의 시간이 소요된다

모든 시작점에서 모든 최단루트를 찾는 경우에 사용