문제 링크
- http://icpc.me/15777
시간복잡도
- $O(N+M)$
풀이
$N < K$이거나 $M < K$이면 간선 $K$개로 이루어진 경로가 존재하지 않습니다. 그러므로 문제에 있는 조건 $\min(N, M, K) \leq X$는 $K \leq X$라고 생각할 수 있습니다.
$K$가 1, 2, 3, 4, 5일 때의 풀이를 각각 알아봅시다.
K = 1
1과 N을 연결하는 간선이 있는지 확인하고, 있으면 그 간선의 가중치를 출력하면 됩니다.
K = 2
경로를 1 - X - N 꼴로 표현할 수 있습니다.
1과 N에서 동시에 갈 수 있는 정점을 모두 구한 뒤, dst(1, X) + dst(X, N)의 최솟값을 출력하면 됩니다.
K = 3
경로를 1 - X - Y - N 꼴로 표현할 수 있습니다.
A[x] = 1과 x를 연결하는 간선의 가중치, B[y] = y와 N을 연결하는 간선의 가중치로 정의합시다. 이때 간선이 존재하지 않는다면 무한대로 설정하면 됩니다.
모든 간선 (x, y)를 보면서, A[x] + dst(x, y) + B[y]의 최솟값을 구하면 됩니다.
K = 4
경로를 1 - X - Y - Z - N 꼴로 표현할 수 있습니다.
1 초과 N 미만인 모든 정점 Y를 보면서, Y와 연결된 두 정점 X, Z(X ≠ Z)에 대해 A[X] + dst(X, Y) + dst(Y, Z) + B[Z]의 최솟값을 구하면 됩니다.
X, Y, Z가 모두 서로 달라야 하기 때문에, (A[X] + dst(X, Y)) 중 가장 작은 2개, (dst(Y, Z) + B[Z]) 중 가장 작은 2개를 구해서 X, Y, Z가 모두 다른 경우 최솟값을 갱신해주면 됩니다.
K = 5
경로를 1 - W - X - Y - Z - N 꼴로 표현할 수 있습니다.
A’[X] = 1 - W - X
꼴의 경로 중 가중치 최솟값, B’[Y] = Y - Z - N
꼴의 경로 중 가중치 최솟값으로 정의합시다.
모든 간선 (X, Y)를 보면서, A’[X] + dst(X, Y) + B’[Y]의 최솟값을 구하면 됩니다.
W, X, Y, Z가 모두 서로 달라야 하기 때문에, A’와 B’ 각각 가장 작은 3개를 저장하면 답을 구할 수 있습니다.
전체 코드
1 |
|