[1753번] 최단경로 구하기 (다익스트라, 우선순위큐, 힙)

2023. 3. 15. 10:10·Coding Test/Graph
728x90

다익스트라

  • 음수간선 X
  • S 시작점부터 다른 모든 노드로 가는 최단거리 구하는 알고리즘
  • 기출 : 음수간선이 없는데 시작점이 있고 최단거리 구하는 문제
  • 원리
      1. 최단거리를 구할 노드에서 시작하여 거리가 입력된 노드 중 최단거리가 가장 작은 노드를 돌아가며 선택
      2. 노드를 돌아가면서, 더 거리가 나오면 값 갱신하여 저장

 

우선순위 큐

 

파이썬 우선순위 큐, 힙

우선순위 큐(Priority Queue) 큐(Queue)는 먼저 들어오는 데이터가 먼저 나가는 FIFO(First In First Out) 형식의 자료구조 우선순위 큐는 먼저 들어오는 데이터가 아니라, 우선순위가 높은 데이터가 먼저 나

karla.tistory.com

 

 

풀이 (PriorityQueue)

import sys
from queue import PriorityQueue
"""
다익스트라
에지의 가중치가 10 이하의 자연수인 방향 그래프
시작점에서 다른 모든 노드의 최단경로

노드의 개수 v(1~20,000), 에지의 개수 e(1~300,000)
출발번호 k
에지 정보 u v w (u에서 v로가는 가중치 w)
두 노드 사이에 에지가 2개이상 존재할 수 있음

시작점은 0, 경로가 없을 경우 INF 출력
"""

# 노드, 엣지의 갯수
v, e = map(int, input().split())

# 시작점
k = int(input())

q = PriorityQueue()

# 최단거리 리스트
distance = [sys.maxsize] * (v+1)

# 방문 배열
visited = [False] * (v+1)

# 인접 리스트
graph = [[] for _ in range(v+1)]

for i in range(e):
    u, v, w = map(int, input().split())  # 가중치가 있는 인접 리스트 저장
    # 인접리스트에 에지 정보 저장
    graph[u].append((v,w))


# 출발 노드는 우선순위 큐에 넣고 시작
q.put((0,k)) # k를 시작점으로 설정
# 거리 리스트에 출발 노드의 값을 0으로 설정
distance[k] = 0



while q.qsize() > 0:

    # 우선순위 큐에서 노드 가져오기
    current = q.get()
    c_v = current[1]

    # 현재 선택 노드 방문 여부 확인
    if visited[c_v]:
        continue
    # 현재 노드 방문 처리
    visited[c_v] = True
    for tmp in graph[c_v]:
        next = tmp[0]
        value = tmp[1]

        # 연결 노드의 최단거리 > 연결 노드 방문전 and 현재 노드 최단 거리 + 비용
        if distance[next] > distance[c_v] + value:
            # 연결 노드 최단 거리 업데이트
            distance[next] = distance[c_v] + value
            # 우선 순위 큐에 연결 노드 추가
            q.put((distance[next], next))

for i in range(1,v+1):
    if visited[i]:
        print(distance[i])
    else:
        print("INF")

 

풀이(heapq)

from heapq import heappush, heappop
import sys
input = sys.stdin.readline
INF = int(1e9) # 무한을 의미하는 값으로 10억을 설정

# 노드의 개수, 간선의 개수 입력
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))

q = []

# 시작 노드로 가기 위한 최단 경로는 0으로 설정하여, 큐에 삽입
heappush(q, (0, start))
distance[start] = 0


while q: # 큐가 비어있지 않다면
    # 최단 거리가 가장 짧은 노드에 대한 정보 꺼내기
    dist, now = heappop(q)
    # 현재 노드가 이미 처리된 적이 있는 노드라면 무시
    if distance[now] < dist:
        continue
    # 현재 노드와 연결된 다른 인접한 노드들을 확인
    for i in graph[now]:
        cost = dist + i[1]
        # 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
        if cost < distance[i[0]]:
            distance[i[0]] = cost
            heappush(q, (cost, i[0]))


# 모든 노드로 가기 위한 최단 거리를 출력
for i in range(1, n+1):
    # 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
    if distance[i] == INF:
        print("INFINITY")
    # 도달할 수 있는 경우, 거리를 출력
    else:
        print(distance[i])

 

더보기

https://www.acmicpc.net/problem/1753

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net

https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html

 

[자료구조] 힙(heap)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://velog.io/@kgorae/이코테-최단-경로-다익스트라-알고리즘-개념

 

 

728x90
'Coding Test/Graph' 카테고리의 다른 글
  • [11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)
  • [1854번] k번째 최단경로 구하기
  • [1516번] 게임 개발하기 (위상정렬)
  • [1717번] 집합의 표현 (유니온 파인드)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DP
    정렬
    자료구조
    최대공약수
    힙
    파이썬
    알고리즘
    그리디
    구간합
    BFS
    그래프
    이분탐색
    프로그래머스
    조합
    다익스트라
    Algorithm
    백준
    최단거리
    큐
    최소신장트리
    덱
    트리
    구현
    스택
    동적계획법
    DFS
    LIS
    플로이드워셜
    월간코드챌린지
    재귀
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[1753번] 최단경로 구하기 (다익스트라, 우선순위큐, 힙)
상단으로

티스토리툴바