[1854번] k번째 최단경로 구하기

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

1854번: K번째 최단경로 찾기

첫째 줄에 n, m, k가 주어진다. (1 ≤ n ≤ 1000, 0 ≤ m ≤ 2000000, 1 ≤ k ≤ 100) n과 m은 각각 김 조교가 여행을 고려하고 있는 도시들의 개수와, 도시 간에 존재하는 도로의 수이다. 이어지는 m개의 줄에

www.acmicpc.net

 

분석

  1. 최단 경로를 표현하는 리스트를 k개의 row를 갖는 2차원 리스트의 형태로 변경
  2. 기존 다익스트라 로직에서, k번째 노드를 찾기 위해서는 노드를 여러번 사용하기 때문에 visited 로직 삭제

 

다익스트라 로직 수정 코드

1. 최단 거리 리스트를 1차원이 아닌 k개의 row를 갖는 2차원 리스트로 선언

distance = array = [[INF] * k for _ in range(n+1)]
q = [(0, 1)]
distance[1][0] = 0

 

2. 최단 거리 리스트 채우기

최단 거리 리스트 채우기 규칙

1. 우선 순위 큐에서 연결된 노드와 가중치 데이터를 가져온다.
2. 연결 노드의 k번째 경로와 신규 경로를 비교해 신규 경로가 더 작을 때 업데이트한다.
     2-1. 이때 경로가 업데이트되는 경우 거리 배열 오름차순으로 정렬하고
     2-2. 우선순위 큐에 연결 노드를 추가한다.
3. 1~2단계를 우선순위 큐가 비워질 때 까지 반복한다.
     (k번째 경로를 찾기 위해 노드를 여러번 방문하는 경우가 있으므로 방문 노드를 체크 로직은 구현하지 않는다.)

 

if distance[node][k-1] > nCost:
    # 새로운 노드의 k번째 최단 거리를 새로운 총 거리로 변경하고 거리 순으로 정렬
    distance[node][k-1] = nCost
    distance[node].sort()

 

 


 

풀이

from heapq import heappush, heappop
import sys

"""
n(1~1,000), m(0~2000,000), k(1~100)
n 도시 수
m 도로 수
k

a b (1~n) c (1~1,000)

1번 시작도시

"""

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

# 노드의 개수, 간선의 개수 입력
n, m, k = map(int, input().split())


# 각 노드에 연결된 노드에 대한 정보를 담는 리스트 생성
graph = [[] for i in range(n+1)]

# 모든 간선 정보를 입력받기
for _ in range(m):
    a,b,c = map(int, input().split())
    graph[a].append((b, c))


# 최단 거리 테이블을 모두 무한으로 초기화
distance = array = [[INF] * k for _ in range(n+1)]

# 우선순위 큐
q = [(0, 1)] # 가중치 우선이기 때문에 가중치, 목표노드 순서로 저장
distance[1][0] = 0

while q:
    # 우선순위 큐에서 데이터 가져오기 (거리, 노드)
    dist, now = heappop(q)
    
    # 현재 노드와 연결된 에지 탐색
    for node, cost in graph[now]:
     
        # 새로운 총 거리 = 현재 노드의 거리 + 에지 가중치
        nCost = dist + cost
        
        if distance[node][k-1] > nCost:
        
            # 새로운 노드의 k번째 최단 거리를 새로운 총 거리로 변경하고 거리 순으로 정렬
            distance[node][k-1] = nCost
            distance[node].sort()
            
            # 우선순위 큐에 새로운 데이터 추가(거리, 노드)
            heappush(q, (nCost, node))


# 모든 노드로 가기 위한 최단 거리를 출력
for i in range(1, n+1):
    if distance[i][k-1] == INF:
        print(-1)
    else:
        print(distance[i][k-1])

 

 

더보기
 

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

다익스트라 음수간선 X S 시작점부터 다른 모든 노드로 가는 최단거리 구하는 알고리즘 기출 : 음수간선이 없는데 시작점이 있고 최단거리 구하는 문제 원리 최단거리를 구할 노드에서 시작하여

karla.tistory.com

728x90
'Coding Test/Graph' 카테고리의 다른 글
  • 그래프 최단거리 알고리즘 정리 및 비교 (다익스트라, 벨만-포드, 플로이드-워셜)
  • [11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)
  • [1753번] 최단경로 구하기 (다익스트라, 우선순위큐, 힙)
  • [1516번] 게임 개발하기 (위상정렬)
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
    큐
    동적계획법
    그리디
    재귀
    LIS
    BFS
    프로그래머스
    최소신장트리
    파이썬
    조합
    정렬
    스택
    DFS
    자료구조
    Algorithm
    최대공약수
    구현
    최단거리
    이분탐색
    힙
    구간합
    다익스트라
    덱
    백준
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[1854번] k번째 최단경로 구하기
상단으로

티스토리툴바