[그래프 이론] 플로이드-워셜(Floyd-Warshall) 알고리즘

2022. 1. 2. 16:11·Algorithm/알고리즘 이론

플로이드-워셜(Floyd-Warshall) 알고리즘이란?


  • 모든 두 노드 u,v 사이에서 가장 최단 거리를 찾는 알고리즘
  • 시간복잡도 $O(n^3)$으로 그래프의 크기가 작을 때만 사용 가능
  • 음의 에지(negative edge)가 있어도 계산이 가능한 알고리즘
  • 단, 음의 사이클(negative cycle)이 있을 경우 불가능

 

기본 개념: $A^k$[i][j]

  • 노드 i에서 j까지의 최단거리 비용에는 $index <= k$인 중간 노드(intermidiate node)들만 사용해야 함
  • 단, k = -1인 경우 i, j에 연결된 에지의 가중치(weight) 값과 비교

 

$A^k$[i][j]의 의미는?

  • i부터 j까지의 경로 중에 최소 비용(minimum cost)을 계산 시, 최단거리가 k보다 큰 노드를 지나쳐서 가는 경우를 제외
  •  

 

 

$A^k$[i][j]의 계산은?

$A^k$[i][j] = min($A^{k-1}$[i][j], $A^{k-1}$[i][k] +$A^{k-1}$[k][j])

 

  • k를 지나는 경우:$A^{k-1}$[i][k] +$A^{k-1}$[k][j]
  • k를 지나지 않는 경우:$A^{k-1}$[i][j]

 

소스코드로 구현(Python)

1) adj 에 저장된 인접 행렬의 값을 활용하여 최단 거리 배열인 dist 배열을 초기화

dist = [[0]*n for _ in range(n)]

for i in range(1, n+1):
	for j in range(1, n+1):
    	if i == j:
        	continue
        elif adj[i][j]:
        	dist[i][j] = adj[i][j]
        else:
        	dist[i][j] = inf

 

2) 각 라운드 별로 중간 노드가 될 노드 번호를 for문 가장 바깥의 k로 삼기

     내부 이중 for문에는 i,j를 통해 각 노드별 모든 거리를 비교하며, k를 지나는 경우/지나지 않는 경우를 비교해 더 작은 값으로 업데이트

for k in range(1, n+1):
	for i in range(1, n+1):
            for j in range(1, n+1):
        	dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j])

 

반응형

'Algorithm > 알고리즘 이론' 카테고리의 다른 글

[문자열] 파이썬으로 구현한 유효한 팰린드롬(Palindrome)  (2) 2023.11.25
이진 탐색(Binary Search)과 매개변수 탐색(Parametric Search)  (0) 2022.03.18
네트워크 플로우(Network Flow)  (2) 2021.11.03
이분 매칭(Bipartite Matching)  (0) 2021.11.02
최소 공통 조상(Lowest Common Ancestor)  (0) 2021.10.04
'Algorithm/알고리즘 이론' 카테고리의 다른 글
  • [문자열] 파이썬으로 구현한 유효한 팰린드롬(Palindrome)
  • 이진 탐색(Binary Search)과 매개변수 탐색(Parametric Search)
  • 네트워크 플로우(Network Flow)
  • 이분 매칭(Bipartite Matching)
계속지나가기
계속지나가기
NLP Engineer
  • 계속지나가기
    코딩스뮤
    계속지나가기
  • 전체
    오늘
    어제
    • 코딩스뮤:)
      • Algorithm
        • 백준 문제풀이
        • 프로그래머스 문제풀이
        • 알고리즘 이론
        • 자료구조
        • SW Expert Academy
      • 인공지능(AI)
        • LLMs
        • 자연어처리(NLP)
        • 컴퓨터비전(CV)
        • 딥러닝(DL)
        • 머신러닝(ML)
        • 인공지능기초수학
        • 선형대수학
      • 컴퓨터 세팅
      • Computer Science
        • 유닉스프로그래밍
        • 프로그래밍언어론
        • 디자인패턴
        • 클린코드
        • SW 영어
        • 리눅스
        • 논리회로
      • Server
        • Docker
      • 바이브 코딩
        • 클로드 코드
  • 블로그 메뉴

    • 홈
    • Who Am I(CV)
    • 태그
  • 링크

    • 깃허브 주소
  • 공지사항

  • 인기 글

  • 태그

    f1-score
    파이썬 클린코드
    MaximumFlow
    알고리즘
    언어모델
    컴퓨터비전
    패턴인식
    SIFT
    비지도학습
    머신러닝
    networkflow
    지도학습
    비용함수
    기계학습
    디지털이미지처리
    DIP
    선형회귀
    DigitalImageProcessing
    에지검출
    결정경계
    경사하강법
    최대유량
    손실함수
    네트워크플로우
    ComputerVision
    NLP
    ML
    LM
    군집화
    machinelearning
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
계속지나가기
[그래프 이론] 플로이드-워셜(Floyd-Warshall) 알고리즘

티스토리툴바