일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- python
- programmers
- 스프링
- softeer
- 회고
- MYSQL
- kotlin
- 백준 알고리즘
- BFS
- 데이터베이스
- C++
- 공부일지
- 백준알고리즘
- 1과목
- 코틀린
- 문제풀이
- 정보처리산업기사
- 소프티어
- CJ UNIT
- 시나공
- SW봉사
- 파이썬
- 코딩교육봉사
- java
- SQL
- 백준
- 자바
- 코딩봉사
- 프로그래머스
Archives
- Today
- Total
JIE0025
[최단경로] 플로이드워셜 python 본문
728x90
✅ 플로이드 워셜
모든 정점에서 모든정점으로 가는 최단경로를 구하고 싶을 때 사용하는 알고리즘
0. 거리를 저장하기 위한 2차원 배열을 만든다. dist[i][k]는 노드i에서 k를 가기위한 비용이다.
1. 어떤 노드에서 다른 노드로 갈수있는 edge(간선)가 존재하면, 최소비용을 할당, 갈수 없다면 INF를 할당한다.
2. 3중 for문을 사용, 중간 정점을 거쳐서 비용이 줄어드는 경우가 있다면, 최소비용을 업데이트한다.
⏺ 핵심 코드
for k in range(n):
for i in range(n):
for j in range(n):
if dist[i][j] > dist[i][k] + dist[k][j]:
dist[i][j] = dist[i][k] + dist[k][j]
💻 CODE
import sys
INF = sys.maxsize
def floydWarshall():
# dist : n*n 리스트를 만든다. INF로 채워준다. (최단경로 배열)
dist = [[INF]*n for _ in range(n)]
# 연결 선에 대한 정보를 dist이차원리스트에 할당한다.
for i in range(n):
for j in range(n):
dist[i][j] = info[i][j]
for k in range(n):
for i in range(n):
for j in range(n):
if dist[i][j] > dist[i][k] + dist[k][j]:
dist[i][j] = dist[i][k] + dist[k][j]
return dist
n = 4
info = [
[0,2,INF,4], #1
[2,0,INF,5], #2
[3,INF,0,INF], #3
[INF,2,1,0] #4
]
result = floydWarshall()
for i in range(n):
for j in range(n):
print(result[i][j], end=' ')
print()
'알고리즘' 카테고리의 다른 글
[기록용] 서브쿼리 이용하기 (MySQL) (0) | 2023.02.11 |
---|---|
[알고리즘] 위상정렬 알고리즘 (Topology Sort) 공부 (0) | 2023.02.10 |
[코딩테스트] 문자열 다루는 방법 정리 (python) (0) | 2023.01.24 |
[이것이코딩테스트다] ch6 정렬 (0) | 2023.01.24 |
[이것이코딩테스트다] ch4 구현 (0) | 2023.01.21 |