계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

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

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

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

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

2022. 1. 2. 16:11
반응형

플로이드-워셜(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

    티스토리툴바