[Algorithm] 최단 경로 알고리즘 : 다익스트라(Dijkstra), 플로이드 워셜(Floyd-Warshall) 알고리즘 파이썬 예제 코드

2021. 9. 4. 06:23·Computer Science/Algorithm
728x90

 

다익스트라 알고리즘 (Dijkstra SAlgorithm)

- 그래프에서 여러 개의 노드가 있을 때, 특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단 경로를 구해주는 알고리즘

- '음의 간선'이 없을 때 정상적으로 동작한다

- 그리디 알고리즘

- 힙(Heap) 자료구조를 사용하여 구현할 것이다

- 시간 복잡도 : O(ElogV)

 

 

> 원리

    1. 출발 노드 설정

    2. 최단 거리 테이블을 초기화

    3. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택

    4. 해당 노드를 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블을 갱신

    5. 3, 4번을 반복

 

 

> Code with Python

import heapq
import sys

input = sys.stdin.readline
INF = int(1e9)

n, m = map(int, input().split())
start = int(input())
graph = [[] for i in range(n + 1)]  # 각 노드에 연결된 노드 정보
distance = [INF] * (n + 1)  # 최단 거리 테이블

for _ in range(m):
    a, b, c = map(int, input().split())
    graph[a].append((b, c))


def dijkstra(start):
    q = []

    heapq.heappush(q, (0, start))
    distance[start] = 0

    while q:
        dist, now = heapq.heappop(q)

        if distance[now] < dist:
            continue

        for i in graph[now]:
            cost = dist + i[0]
            if cost < distance[i[1]]:
                distance[i[1]] = cost
                heapq.heappush(q, (cost, i[1]))


dijkstra(start)

for i in range(1, n + 1):
    if distance[i] == INF:
        print("INFINITY")
    else:
        print(distance[i])

 

 

 

 

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

- 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우

- 2차원 리스트에 최단 거리 정보를 저장

- 다이나믹 프로그래밍

- 시간 복잡도 : O(N^3)

 

 

> Code with Python

INF = int(1e9)

n = int(input())
m = int(input())
graph = [[INF] * (n + 1) for _ in range(n + 1)]

for a in range(1, n + 1):
    for b in range(1, n + 1):
        if a == b:
            graph[a][b] = 0

for _ in range(m):
    a, b, c = map(int, input().split())
    graph[a][b] = c

for k in range(1, n + 1):
    for a in range(1, n + 1):
        for b in range(1, n + 1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

for a in range(1, n + 1):
    for b in range(1, n + 1):
        if graph[a][b] == INF:
            print("INFINITY", end=' ')
        else:
            print(graph[a][b], end=' ')
    print()

 

 

 

 

 

 

 

📚 참고서적 : 이것이 코딩테스트다 with 파이썬

 

 

728x90
저작자표시 비영리 (새창열림)

'Computer Science > Algorithm' 카테고리의 다른 글

[Algorithm] 다양한 그래프 알고리즘 : 서로소 집합(union-find), 크루스칼 알고리즘(Kruskal Algorithm), 위상 정렬(topology sort)  (0) 2021.09.04
[Algorithm] 다이나믹 프로그래밍(Dynamic Programming) : 메모이제이션(Memoization), 탑다운(top-down) / 보텀업(bottom-up)  (0) 2021.09.04
[Algorithm] 이진 탐색 (Binary Search) : 과정 및 예제 코드  (0) 2021.09.04
[Algorithm] 정렬 (Sorting) : 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬 파이썬 정렬 라이브러리 예제 코드 및 시간 복잡도  (0) 2021.09.04
[Algorithm] DFS (깊이 우선 탐색) / BFS (너비 우선 탐색) : 파이썬 예제 코드 + 인접 행렬, 인접 리스트  (0) 2021.09.01
'Computer Science/Algorithm' 카테고리의 다른 글
  • [Algorithm] 다양한 그래프 알고리즘 : 서로소 집합(union-find), 크루스칼 알고리즘(Kruskal Algorithm), 위상 정렬(topology sort)
  • [Algorithm] 다이나믹 프로그래밍(Dynamic Programming) : 메모이제이션(Memoization), 탑다운(top-down) / 보텀업(bottom-up)
  • [Algorithm] 이진 탐색 (Binary Search) : 과정 및 예제 코드
  • [Algorithm] 정렬 (Sorting) : 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬 파이썬 정렬 라이브러리 예제 코드 및 시간 복잡도
s_ih_yun
s_ih_yun
  • s_ih_yun
    CODESYUN
    s_ih_yun
  • 전체
    오늘
    어제
    • 분류 전체보기 (338) N
      • Web (8) N
      • Java (7) N
      • Spring (18) N
      • Git (16) N
      • MyBatis (1)
      • HTML & CSS (14)
      • JavaScript (11)
      • DevOps (4) N
      • Cloud (8)
      • Lanuage (13)
        • C++ (3)
        • Python (10)
      • DB (1) N
        • MySQL (1)
        • Oracle (2)
      • Computer Science (26)
        • Concept (3)
        • Algorithm (23)
      • Baekjoon (104)
        • 단계별로 풀어보기 (78)
      • CodeUp (98)
        • Python 기초 100제 (98)
      • Programmers (2)
      • Books (3)
      • etc (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Syun's Pages
  • 인기 글

  • 태그

    BOJ
    Cloud
    HTML
    Tistory
    aws
    java
    웹
    oracle
    web
    codeup
    자료구조
    SourceTree
    CSS
    VS Code
    myBatis
    db
    알고리즘
    spring
    c++
    Python
    clean code
    C
    MySQL
    github
    CodeUp 기초 100제
    git
    Programmers
    단계별로 풀어보기
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s_ih_yun
[Algorithm] 최단 경로 알고리즘 : 다익스트라(Dijkstra), 플로이드 워셜(Floyd-Warshall) 알고리즘 파이썬 예제 코드
상단으로

티스토리툴바