- Today
- Total
- array
- Graph
- ์๋ฃ๊ตฌ์กฐ
- ์ธํด
- ๋ฐฑ์๋
- PS
- ์กธ์ ์ํ
- tree
- ์๋ฐ
- database
- ๊ทธ๋ฆฌ๋
- leetcode
- ๋ค์ต์คํธ๋ผ
- ์๋ฐ์์ ์
- ๊ตฌํ
- ๋ฌธ๋ฒ
- BFS
- OOP
- CS
- ์์์ ๋ ฌ
- ๋ฒจ๋งํฌ๋
- MST
- spring
- ๋ฐฑ์ค
- Algorithm
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- dp
- pytorch
- java
- ํ๋ก๊ทธ๋๋จธ์ค
Partially Committed
[๋ฐฑ์ค 1854] K๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ (JAVA) ๋ณธ๋ฌธ
[๋ฐฑ์ค 1854] K๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ (JAVA)
WonderJay 2023. 1. 18. 11:38๋ด์บ ํ๋ฅผ ๋ง์น ๊น์ง์ ์กฐ๊ต๋ ์ฌ๋ฌ ๋์๋ฅผ ๋๋ฉฐ ์ฌํ์ ๋ค๋ ๊ณํ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๊น ์กฐ๊ต๋, '๋๋ฆผ์ ๋ฏธํ'์ ์ค์์ํ๋ ์ฌ๋์ด๋ผ ํญ์ ์ต๋จ๊ฒฝ๋ก๋ก๋ง ์ด๋ํ๋ ๊ฒ์ ๋ณ๋ก ์ข์ํ์ง ์๋๋ค. ํ์ง๋ง ๋๋ฌด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ๋ก๋ ๊ทธ๋ฆฌ ๋งค๋ ฅ์ ์ธ ๊ฒ๋ง์ ์๋์ด์, ์ ๋นํ ํํ์์ธ 'k๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก'๋ฅผ ๊ตฌํ๊ธธ ์ํ๋ค. ๊ทธ๋ฅผ ๋๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ n, m, k๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ n ≤ 1000, 0 ≤ m ≤ 2000000, 1 ≤ k ≤ 100) 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์ ์ถ๋ ฅํ๋ค. ์ต๋จ๊ฒฝ๋ก์ ๊ฐ์ ์ ์ ์ด ์ฌ๋ฌ ๋ฒ ํฌํจ๋์ด๋ ๋๋ค.
์์ ์ ๋ ฅ 1
5 10 2
1 2 2
1 3 7
1 4 5
1 5 6
2 4 2
2 3 4
3 4 6
3 5 8
5 2 4
5 4 1
์์ ์ถ๋ ฅ 1
-1
10
7
5
14
์ด๋ ต๋ค...๐
์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ์๋ ๋ฌ๋ฆฌ ์์๋ ธ๋์์ ๋์ฐฉ๋ ธ๋๊น์ง k ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ด์ผํ๋ค. ์ด๋ฅผ ์ํด์๋ ์๋์ ๋ ๊ฐ์ง ํฌ์ธํธ๋ฅผ ์๊ฐํด์ผํ๋ค.
1. k ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํด์ผ ํ๋๊น, ๊ธฐ์กด์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉํ๋ 1์ฐจ์ int ํ ๋ฐฐ์ด์ dist ๋ก ์ฌ์ฉํ๋ฉด ์๋๊ฒ ๋ค. ๊ฐ๊ฐ์ ์์๊ฐ i ๋ ธ๋์ ๋ํ k ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ข๊ฒ ๋ค. ๊ทผ๋ฐ ์ ๋ ฌ ์์๋ ์ ์งํ์์ข๊ฒ๋ค..
โถ ์ฐ์ ์์ํ ๋ฐฐ์ด์ ์ฌ์ฉํ์.
2. k ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์์ ๊ฐ์ ๋ ธ๋๋ฅผ ์ฌ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ์์๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ visited ๋ฐฐ์ด๋ก ๋ฐฉ์งํ์๋๋ฐ.
โถ visited ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๋๋ค.
3. k ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋๋ก ํ ๊น ์๋๋ฉด ๋ชจ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ค ์ ์ฅํ๋๋ก ํด์ ์ถ๋ ฅํ ๋ k ๊ฐ๋ง ๋ฝ์๋ผ๊น? ๋น์ฐํ, k ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ง ์ ์ฅํ๋ ๊ฒ์ด ํจ์ฌ ํจ์จ์ ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ก์ง์ ์ด๋ป๊ฒ ๊ตฌํํ์ง?
โถ ํ์ฌ ๋ ธ๋์ ํด๋นํ๋ ์ฐ์ ์์ ํ ๋ฐฐ์ด์ k ๊ฐ ๋ณด๋ค ์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ง ์ ์ฅ๋์ด ์๋ค๋ฉด, ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ๊ฒฌํ ์๋ก์ด ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ค. (์ฐ์ ์์ ํ์ ์ ๋ ฌ ์ ์ฑ ์ ์ํด ์๋์ผ๋ก ์ ๋ ฌ๋๋ค.) ๊ทผ๋ฐ ๋ง์ฝ์ k ๊ฐ ์ด์์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์ ์ฅ๋์ด์๋๋ฐ ์๋ก์ด ๊ฒฝ๋ก๊ฐ ๋ฐ์ํ๋ค๋ฉด?
โถ ๊ทธ๋ฌํ ๊ฒฝ์ฐ์๋ ํ์ฌ ์ฐ์ ์์ํ ๋ฐฐ์ด์ ์ ์ฅ๋ top ๊ณผ ๋น๊ตํ๋ค. i ๋ฒ์งธ ๋ ธ๋์ ๋ํ ์ฐ์ ์์ํ ๋ฐฐ์ด์ top ์, "i ๋ฒ์งธ ๋ ธ๋์ ๋๋ฌํ๋ ํ์ฌ๊น์ง ์ ์ฅ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์ค ๊ฐ์ฅ ํฐ ๊ฐ" ์ด๋ค. ์ด ๊ฐ๋ณด๋ค ์๋ก ๊ณ์ฐ๋ ๊ฒฝ๋ก๊ฐ ์๋ค๋ฉด, top ์ poll() ํด์ฃผ๊ณ , ์๋ก ๊ณ์ฐ๋ ๊ฒฝ๋ก๋ฅผ add ํด์ค๋ค.
โถ ์ด๋ฌํ ๊ณผ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ ค์ฃผ๋ฉด, ์ฐ์ ์์ํ ๋ฐฐ์ด์ size ๊ฐ k ์ด๋ฉด top ์ด k ๋ฒ์งธ ์ต๋จ๊ฑฐ๋ฆฌ์ด๊ณ , size ๊ฐ k ๊ฐ ์๋๋ฉด k ๋ฒ์งธ ์ต๋จ๊ฑฐ๋ฆฌ๋ ์กด์ฌํ์ง ์๋ ๊ฒ์ด๋ค.
โถ ์ ์ํ ์ ์ ๋ฌธ์ ์์ 1 ๋ฒ๋ ธ๋์์ 1 ๋ฒ๋ ธ๋๋ก ํฅํ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ 0 ์ด๋ผ๊ณ ์ ์ํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์์ํ ๋, ์ด๊ธฐ ๋ ธ๋๋ฅผ ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Node>[] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk = new StringTokenizer(br.readLine());
int n = Integer.parseInt(stk.nextToken()); // ๋
ธ๋ ๊ฐ์
int m = Integer.parseInt(stk.nextToken()); // ์์ง ๊ฐ์
int k = Integer.parseInt(stk.nextToken()); // k
// ๋จผ์ ๊ทธ๋ํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์.
graph = new ArrayList[n + 1];
for (int i = 0; i <= n; i++)
graph[i] = new ArrayList<Node>();
for (int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stk.nextToken());
int b = Integer.parseInt(stk.nextToken());
int cost = Integer.parseInt(stk.nextToken());
graph[a].add(new Node(b, cost));
}
PriorityQueue<Integer>[] distQueue = new PriorityQueue[n + 1];
Comparator<Integer> cp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? 1 : -1;
}
};
for (int i = 0; i <= n; i++) {
distQueue[i] = new PriorityQueue<>(k, cp);
}
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(1, 0)); // ์์์
distQueue[1].add(0);
while (!pq.isEmpty()) {
Node now_node = pq.poll();
for (Node cur : graph[now_node.toNode]) {
// ์ฐ๊ฒฐ๊ด๊ณ ํ์
if (distQueue[cur.toNode].size() < k) {
// ์ ์ฅ๋ ๊ฒฝ๋ก๊ฐ k ๊ฐ ๋ณด๋ค ์์ผ๋ฉด ๊ฒฝ๋ก ์ ์ฅ
distQueue[cur.toNode].add(now_node.w + cur.w);
pq.add(new Node(cur.toNode, now_node.w + cur.w));
} else if (distQueue[cur.toNode].peek() > now_node.w + cur.w) {
// ์ ์ฅ๋ ๊ฒฝ๋ก๊ฐ k ๊ฐ์ด๊ณ , ์๋ก์ด ๊ฒฝ๋ก๊ฐ ํ์ฌ ๊ฐ์ฅ ํฐ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ถ๊ฐ
distQueue[cur.toNode].poll();
distQueue[cur.toNode].add(now_node.w + cur.w);
pq.add(new Node(cur.toNode, now_node.w + cur.w));
}
}
}
for(int i = 1 ; i <= n ; i++){
if(distQueue[i].size()==k){
bw.write(distQueue[i].peek()+"\n");
} else bw.write("-1\n");
}
bw.flush();
bw.close();
}
static class Node implements Comparable<Node> {
int toNode;
int w;
public Node(int toNode, int w) {
this.toNode = toNode;
this.w = w;
}
@Override
public int compareTo(Node v) {
return this.w < v.w ? -1 : 1;
}
}
}
'๐ฅ Algorithm || ๋ฌธ์ ํ์ด > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 1219] ์ค๋ฏผ์์ ๊ณ ๋ฏผ (JAVA) (0) | 2023.01.18 |
---|---|
[๋ฐฑ์ค 11657] ํ์๋จธ์ (JAVA) (0) | 2023.01.18 |
[๋ฐฑ์ค 1916] ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (JAVA) (0) | 2023.01.17 |
[๋ฐฑ์ค 1753] ์ต๋จ๊ฒฝ๋ก (JAVA) (1) | 2023.01.17 |
[๋ฐฑ์ค 1948] ์๊ณ๊ฒฝ๋ก (JAVA) (0) | 2023.01.17 |