JEon.E
일단 ML 엔지니어 생존일지
JEon.E
전체 방문자
오늘
어제
  • 분류 전체보기 (164)
    • 논문 스터디 (8)
      • 논문 구현 (0)
      • Code-LLM (0)
      • ML attack (6)
      • Fuzzing (2)
    • 동향 및 조사 (3)
    • Stack Overflow (6)
    • Setting Tips (14)
    • ML 엔지니어링 (1)
      • AI Math (0)
      • Pytorch (1)
    • 알고리즘 (132)
      • 이론 (8)
      • 문제풀이 (105)
      • 삼성 기출 문제풀이 (18)
    • Hack (0)
      • 해킹 맛보기 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • NLP black-box attack
  • Graph
  • 시뮬레이션
  • keras
  • dfs
  • Adversarial Defense
  • 프로그래머스
  • 강화학습
  • 백트래킹
  • 그래프
  • 크루스칼
  • 다시
  • 플로이드-워샬
  • dp
  • 구현
  • 네이버 부스트캠프
  • Fuzzing 동향
  • BFS
  • greedy
  • BOJ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JEon.E
알고리즘/이론

플로이드 워샬 알고리즘 요약 정리

알고리즘/이론

플로이드 워샬 알고리즘 요약 정리

2023. 5. 27. 21:08

플로이드 워샬 알고리즘 이란

모든 정점의 쌍 사이의 최단 거리를 구하는 알고리즘 

정점 사이의 최단 거리를 구하기 때문에 방향 그래프와 무방향 그래프 모두 상관없이 해당 알고리즘을 사용할 수 있다.

푸는 방법은 꽤 단순한데 N개의 정점이 있다면 NxN의 배열로 그래프를 나타낸 후에 해당 그래프를 최단거리 그래프로 교체해준다.

교체하는 방법은 거쳐가는 임의의 정점이 있다고 할때의 최단거리를 차례로 구한 후에 최솟값을 구하는 것. 

 

보통 3중 for문을 사용해서 풀며 다음과 같이 가장 첫 for문의 k가 거쳐가는 정점을 의미한다. 그리고 j와 i는 시작 정점과 도착 정점을 의미한다. 여기서 아래 코드와 같이 거쳐가는 정점이 있을 때의 거리와 원래의 j -> i로 가는 거리 중 최단거리를 선택하도록 하면 된다. 

1
2
3
4
for k in range(N):
    for j in range(N):
        for i in range(N):
            graph[j][i] = min(graph[j][i], graph[j][k] + graph[k][i])
cs

추가적으로 각각의 최단 거리의 경로를 추적하는 방법은 최단거리를 구하는 알고리즘에 중간 정점을 저장하는 그래프를 추가하면 된다. 

기본적으로 graph[a][b] = b 의 도착 정점을 저장하는 그래프이며 다음과 같이 저장해주면 된다. 

1
2
3
4
5
for k in range(N):
    for j in range(N):
        for i in range(N):
            if graph[j][k] + graph[k][i] < graph[j][i]:
                graph[j][i] = graph[j][k]
cs

그후에 경로를 출력할 때는  다음과 같이 queue나 stack으로 추적해서  출력해주면 끝. 

1
2
3
4
5
6
7
8
9
10
11
for j in range(N):
    for i in range(N):
        queue = deque()
        queue.append((j, i))
        while queue:
            y, x = queue.pop()
            result.append(y)
            if graph[y][x] == 0:
                print(result)
            else:
                queue.append((graph[y][x], x))
cs

 

 

Reference

  • https://blog.encrypted.gg/1035
반응형
저작자표시 비영리 변경금지 (새창열림)

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

데이크스트라(다익스트라) 알고리즘 요약 정리  (0) 2023.06.02
재귀 (== 분할정복)  (0) 2023.05.17
그래프 관련 알고리즘 요약 정리 (크루스칼, 프림, 위상 정렬)  (0) 2023.04.11
그래프 이론 요약 정리  (0) 2023.03.27
동적 계획법, 다이나믹 프로그래밍  (0) 2023.03.07
  • 플로이드 워샬 알고리즘 이란
  • Reference
'알고리즘/이론' 카테고리의 다른 글
  • 데이크스트라(다익스트라) 알고리즘 요약 정리
  • 재귀 (== 분할정복)
  • 그래프 관련 알고리즘 요약 정리 (크루스칼, 프림, 위상 정렬)
  • 그래프 이론 요약 정리
JEon.E
JEon.E
ML Security Engineer로 살아남기 도전중
일단 ML 엔지니어 생존일지ML Security Engineer로 살아남기 도전중

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.