[Boj_1854] K๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1854
โธ ๋ฌธ์
๋ด์บ ํ๋ฅผ ๋ง์น ๊น์ง์ ์กฐ๊ต๋ ์ฌ๋ฌ ๋์๋ฅผ ๋๋ฉฐ ์ฌํ์ ๋ค๋ ๊ณํ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๊น ์กฐ๊ต๋, '๋๋ฆผ์ ๋ฏธํ'์ ์ค์์ํ๋ ์ฌ๋์ด๋ผ ํญ์ ์ต๋จ๊ฒฝ๋ก๋ก๋ง ์ด๋ํ๋ ๊ฒ์ ๋ณ๋ก ์ข์ํ์ง ์๋๋ค. ํ์ง๋ง ๋๋ฌด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ๋ก๋ ๊ทธ๋ฆฌ ๋งค๋ ฅ์ ์ธ ๊ฒ๋ง์ ์๋์ด์, ์ ๋นํ ํํ์์ธ 'k๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก'๋ฅผ ๊ตฌํ๊ธธ ์ํ๋ค. ๊ทธ๋ฅผ ๋๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ n, m, k๊ฐ ์ฃผ์ด์ง๋ค. (1≤n≤1000, 0≤m≤250000, 1≤k≤100, mk≤3000000) n๊ณผ m์ ๊ฐ๊ฐ ๊น ์กฐ๊ต๊ฐ ์ฌํ์ ๊ณ ๋ คํ๊ณ ์๋ ๋์๋ค์ ๊ฐ์์, ๋์ ๊ฐ์ ์กด์ฌํ๋ ๋๋ก์ ์์ด๋ค.
์ด์ด์ง๋ m๊ฐ์ ์ค์๋ ๊ฐ๊ฐ ๋๋ก์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ธ ๊ฐ์ ์ ์ a, b, c๊ฐ ํฌํจ๋์ด ์๋ค. ์ด๊ฒ์ a๋ฒ ๋์์์ b๋ฒ ๋์๋ก ๊ฐ ๋๋ c์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ์๋ฏธ์ด๋ค. (1≤a,b≤n, 1≤c≤1000)
๋์์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ n๋ฒ๊น์ง ์ฐ์ํ์ฌ ๋ถ์ด ์์ผ๋ฉฐ, 1๋ฒ ๋์๋ ์์๋์์ด๋ค. ๋ ๋๋ก์ ์์์ ๊ณผ ๋์ฐฉ์ ์ด ๋ชจ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
โธ ์ถ๋ ฅ
n๊ฐ์ ์ค์ ์ถ๋ ฅํ๋ค. i๋ฒ์งธ ์ค์ 1๋ฒ ๋์์์ i๋ฒ ๋์๋ก ๊ฐ๋ k๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก์ ์์์๊ฐ์ ์ถ๋ ฅํ๋ค.
๊ฒฝ๋ก์ ์์์๊ฐ์ ๊ฒฝ๋ก ์์ ์๋ ๋๋ก๋ค์ ๋ฐ๋ผ ์ด๋ํ๋๋ฐ ํ์ํ ์๊ฐ๋ค์ ํฉ์ด๋ค. i๋ฒ ๋์์์ i๋ฒ ๋์๋ก ๊ฐ๋ ์ต๋จ๊ฒฝ๋ก๋ 0์ด์ง๋ง, ์ผ๋ฐ์ ์ธ k๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก๋ 0์ด ์๋ ์ ์์์ ์ ์ํ๋ค. ๋, k๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด −1์ ์ถ๋ ฅํ๋ค. ์ต๋จ๊ฒฝ๋ก์ ๊ฐ์ ์ ์ ์ด ์ฌ๋ฌ ๋ฒ ํฌํจ๋์ด๋ ๋๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ ๋ฌธ์ ๋ ๋ฒจ : ํ๋ ํฐ๋ 4
- ๐ ๋ฌธ์ ์ ํ : ์๋ฃ๊ตฌ์กฐ, ๊ทธ๋ํ ์ด๋ก , ์ต๋จ ๊ฒฝ๋ก, ๋ฐ์ดํฌ์คํธ๋ผ, ์ฐ์ ์์ ํ
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ 1๋ฒ ๋์์์ i๋ฒ ๋์๋ก ๊ฐ๋ k๋ฒ์งธ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
ํ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก, ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
์์ ์ ๋ ฅ 1์์ 2๋ฒ์งธ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด๋ณด์.
๋์ (i) | 1๋ฒ์งธ ์ต๋จ ๊ฒฝ๋ก (1 → i) | 2๋ฒ์งธ ์ต๋จ ๊ฒฝ๋ก (1 → i) |
1 | 0 | -1 (๊ฒฝ๋ก ์กด์ฌ x) |
2 | 2 (1 → 2) | 10 (1 → 5 → 2) |
3 | 6 (1 → 2 → 3) | 7 (1 → 3) |
4 | 4 (1 → 2 → 4) | 5 (1 → 4) |
5 | 6 (1 → 5) | 14 (1 → 2 → 3 → 5) |
์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด 1๋ฒ์งธ ์ต๋จ ๊ฒฝ๋ก๋ง ๊ตฌํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ์์๋ k๋ฒ์งธ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ผ ํ๋ฏ๋ก, ๊ธฐ์กด์ int[] dist ๋ฐฐ์ด๋ง์ผ๋ก๋ ํด๊ฒฐํ ์ ์๋ค.
๋ฐ๋ผ์, PriorityQueue[] distQue ์ฐ์ ์์ ํ ๋ฐฐ์ด์ ํ์ฉํ์ฌ 1๋ฒ ๋ ธ๋์์ ๊ฐ ๋ ธ๋๊น์ง์ k๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ด๋, ์ฐ์ ์์ ํ ๋ฐฐ์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค.
์ฐ์ ์์ ํ ๋ฐฐ์ด์ ์ ์ฅ๋ ์ต๋จ ๊ฒฝ๋ก์ ๊ฐ์๊ฐ k๊ฐ ๋ฏธ๋ง์ด๋ผ๋ฉด, ์๋ก์ด ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค.
์ด๋ฏธ k๊ฐ ์ด์์ ์ต๋จ ๊ฒฝ๋ก๊ฐ ์ ์ฅ๋ ์ํ์์ ์๋ก์ด ๊ฒฝ๋ก๊ฐ ๋ฐ๊ฒฌ๋๋ฉด, ๊ธฐ์กด ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์๋ก์ด ๊ฒฝ๋ก๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ์๋ง ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ๊ฑฐํ๊ณ ์๋ก์ด ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 99924KB
์๊ฐ : 904ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n, k;
static ArrayList<ArrayList<Pos>> list;
static PriorityQueue<Integer>[] distQue;
static public class Pos implements Comparable<Pos> {
int end; int dist;
public Pos(int end, int dist) {
this.end = end; this.dist = dist;
}
@Override
public int compareTo(Pos o) {
return this.dist - o.dist;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); // ๋์์ ๊ฐ์
int m = Integer.parseInt(st.nextToken()); // ๋๋ก์ ์
k = Integer.parseInt(st.nextToken()); // k๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก
list = new ArrayList<>();
for (int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
}
int a, b, c;
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
list.get(a).add(new Pos(b, c));
}
dijkstra();
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
if (distQue[i].size() == k) {
sb.append(distQue[i].peek()).append("\n");
} else sb.append(-1).append("\n"); // k๋ฒ์งธ ๊ฒฝ๋ก ์กด์ฌํ์ง ์์ผ๋ฉด -1
}
System.out.println(sb);
}
private static void dijkstra() {
distQue = new PriorityQueue[n+1];
// ๋ด๋ฆผ์ฐจ์
for (int i = 0; i <= n; i++) {
// ์ต๋ k๊ฐ์ ๊ฒฝ๋ก ์ ์ฅ
distQue[i] = new PriorityQueue<>((o1,o2)->o2-o1);
}
PriorityQueue<Pos> pq = new PriorityQueue<>();
pq.offer(new Pos(1, 0));
distQue[1].add(0);
while (!pq.isEmpty()) {
Pos now = pq.poll();
int nowNode = now.end;
for (Pos next : list.get(nowNode)) {
int nextNode = next.end;
int nextDist = now.dist + next.dist;
// k๊ฐ์ ๊ฒฝ๋ก๊ฐ ์ ์ฅ๋์ง ์์ ๊ฒฝ์ฐ
if (distQue[nextNode].size() < k) {
distQue[nextNode].add(nextDist); // ์๋ก์ด ๊ฒฝ๋ก ์ถ๊ฐ
pq.offer(new Pos(nextNode, nextDist));
} // ๊ธฐ์กด k๋ฒ์งธ ๊ฒฝ๋ก๋ณด๋ค ๋ ์งง์ ๊ฒฝ๋ก์ธ ๊ฒฝ์ฐ
else if (distQue[nextNode].peek() > nextDist) {
distQue[nextNode].poll(); // ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก ์ ๊ฑฐ
distQue[nextNode].add(nextDist); // ์๋ก์ด ๊ฒฝ๋ก ์ถ๊ฐ
pq.offer(new Pos(nextNode, nextDist));
}
}
}
}
}
์ด๋ ต๋ค ์ด๋ ค์ ! ๐๐ฅ