티스토리 뷰

'다익스트라 알고리즘'은 매우 친숙하지만, '플로이드-워셜' 알고리즘은 처음 들어봐서 이 글을 작성하게 되었다. 

 

다익스트라는 하나의 정점에서 다른 정점까지 최단거리만 구해주는데, 플로이드-워셜은 모든 노드간 최단 경로를 구할 수 있다. 

 

이 알고리즘의 핵심은 모든 노드를 중간으로 해서 나오는 값으로 업데이트를 해주는 과정이다. 

 

 

이런 그래프가 있다고 해 보자.

 

이렇게 거리 배열을 만들었다. 

 

그리고, 1번 노드를 새로운 중간노드로 설정해서 값을 업데이트 해준다. 

 

 

 

2번 노드를 새로운 중간노드로 설정해서 값을 업데이트 해준다.

 

 

 

이렇게 5번까지 해줘야 한다...

시간복잡도는 O(n^3)이라서 n이 작을때만 써야한다!!

 

 각 노드별 모든 거리를 살펴보면서 k를 중간 노드로 삼을 때와 아닐 때의 값을 비교해 더 작은 값으로 업데이트 하는 식으로 코드를 짜면 된다. 끝!

 

참고: chanhuiseok.github.io/posts/algo-50/ 갓 블로그..

 

 

[코드] 이자 백준 11404번 풀이

# 11404번 플로이드
import sys

n = int(sys.stdin.readline())
m = int(sys.stdin.readline())
data = [[sys.maxsize] * (n + 1) for _ in range(n + 1)]

for i in range(m):
    a, b, c = map(int, sys.stdin.readline().split())
    data[a][b] = min(c, data[a][b])

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

# update
for midValue in range(1, n+1):  # 중간값
    for i in range(1, n+1):  # 테이블 안에 도는 용도
        for j in range(1, n+1):
            data[i][j] = min(data[i][midValue] + data[midValue][j], data[i][j])

for i in range(1, n+1):
    for j in range(1, n+1):
        if data[i][j] == sys.maxsize:
            data[i][j] = 0
        print(f"{data[i][j]} ", end='')
    print("")

build in PyPy

'PL > Python' 카테고리의 다른 글

파이썬 EOF까지 인풋 받기  (0) 2021.01.02
[Python] lambda(람다)식 사용하기  (0) 2020.05.29
파이썬 list comprehension  (1) 2020.05.29
파이썬 //, /, %  (0) 2020.05.25
파이썬 array의 길이  (0) 2020.04.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함