본문 바로가기
백준알고리즘/우선순위큐

(Python/플4)백준 알고리즘 1854번: K번쨰 최단경로 찾기

by windy7271 2024. 8. 17.
728x90
반응형

문제 바로가기 

문제:

봄캠프를 마친 김진영 조교는 여러 도시를 돌며 여행을 다닐 계획이다. 그런데 김 조교는, '느림의 미학'을 중요시하는 사람이라 항상 최단경로로만 이동하는 것은 별로 좋아하지 않는다. 하지만 너무 시간이 오래 걸리는 경로도 그리 매력적인 것만은 아니어서, 적당한 타협안인 '

입력:

첫째 줄에 n, m, k가 주어진다. ( 1 ≤ n ≤ 1,000, 0 ≤ m ≤ 250,000, 1 ≤ k ≤ 100, mk ≤ 3,000,000) n ,m은 각각 김 조교가 여행을 고려하고 있는 도시들의 개수와, 도시 간에 존재하는 도로의 수이다. 이어지는 m개의 줄에는 각각 도로의 정보를 제공하는 세 개의 정수 a, b, c가 포함되어 있다. 이것은 a번 도시에서 b번 도시로 갈 때는 c의 시간이 걸린다는 의미이다. ( 1 ≤ a, b ≤ n, 1 ≤ c ≤ 1\000) 도시의 번호는 1번부터 n번까지 연속하여 붙어 있으며, 1번 도시는 시작도시이다. 두 도로의 시작점과 도착점이 모두 같은 경우는 없다.

 

출력:

n개의 줄을 출력한다. i번째 줄에 1번 도시에서 i번 도시로 가는 k번째 최단경로의 소요시간을 출력한다. 경로의 소요시간은 경로 위에 있는 도로들을 따라 이동하는데 필요한 시간들의 합이다. i번 도시에서 i번 도시로 가는 최단경로는 0이지만, 일반적인 k번째 최단경로는 0이 아닐 수 있음에 유의한다. 또, k번째 최단경로가 존재하지 않으면 -1을 출력한다. 최단경로에 같은 정점이 여러 번 포함되어도 된다.

 

 

풀이:

 

처음 접근 

우선순위큐와 같지만 노드에 갈 수 있는 거리를 다 저장하는식으로 했다.

문제에서 준 예제는 맞지만

질문게시판에 있는것중 하나 넣으면 틀린다.

 

import sys, heapq


n, m, k = map(int, input().split())
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    u, v, e = map(int, input().split())
    graph[u].append((v, e))


def dj(i):
    dist = [1e9] * (n + 1)
    dist[i] = 0
    dist_[i].append(0)

    hq = [(0, i)]

    while hq:
        cur_w, cur_node = heapq.heappop(hq)
        for to_node, to_w in graph[cur_node]:
            d = dist[cur_node] + to_w
            dist_[to_node].append(d)
            if d < dist[to_node]:
                dist[to_node] = d
                heapq.heappush(hq, (d, to_node))
    return dist_


dist_ = [[] for _ in range(n + 1)]
dj(1)
for i in dist_[1::]:
    i.sort()
    print(i[k-1] if len(i) >= k else -1)

 

 

그래서 방법을 2차원 거리로 한다.

[노드][k번째] 인 것이다.

 

import sys, heapq



def dj(i):
    dist_[i][0] = 0
    hq = []
    heapq.heappush(hq, [0, i])
    while hq:
        cur_w, cur_node = heapq.heappop(hq)
        for to_node, to_w in graph[cur_node]:
            d = cur_w + to_w
            if d < dist_[to_node][k - 1]:
                dist_[to_node][k - 1] = d
                dist_[to_node].sort()
                heapq.heappush(hq, [d, to_node])


n, m, k = map(int, input().split())
graph = [[] for _ in range(n + 1)]

for _ in range(m):
    u, v, e = map(int, input().split())
    graph[u].append((v, e))

dist_ = [[sys.maxsize] * k for _ in range(n + 1)]
dj(1)
print(dist_)
for i in dist_[1::]:
    print(i[k-1] if i[k-1] != sys.maxsize else -1)

 

dist_[to_node].sort() 를 해주는 이유는

매번 정렬을 해줘야 k-1 인덱스로 접근이 가능하다.

 

if 문 안에 2줄이 어렵지 않았나 싶다.

반응형

댓글