- Today
- Total
- ์๋ฃ๊ตฌ์กฐ
- tree
- ๋ฐฑ์ค
- ์ธํด
- BFS
- pytorch
- leetcode
- ๊ตฌํ
- java
- PS
- ๋ค์ต์คํธ๋ผ
- MST
- Graph
- ์๋ฐ
- ์์์ ๋ ฌ
- ๊ทธ๋ฆฌ๋
- ๋ฐฑ์๋
- ์๋ฐ์์ ์
- ๋ฒจ๋งํฌ๋
- ์กธ์ ์ํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋ฌธ๋ฒ
- dp
- database
- array
- Algorithm
- ํ๋ก๊ทธ๋๋จธ์ค
- CS
- OOP
- spring
Partially Committed
[๋ฐฑ์ค 1162 ๋๋กํฌ์ฅ] ์๋ฐ (๋ค์ต+DP) ๋ณธ๋ฌธ
[๋ฐฑ์ค 1162 ๋๋กํฌ์ฅ] ์๋ฐ (๋ค์ต+DP)
WonderJay 2023. 5. 28. 14:151162๋ฒ: ๋๋กํฌ์ฅ (acmicpc.net)
๋ค์ต์คํธ๋ผ + dp
์ด์ ์ **๋ฏธํ์ธ ๋์ฐฉ์ง ๋ฌธ์ **๋ฅผ ํตํด ๋ค์ต์คํธ๋ผ์ ๊ธฐ๋ณธ ํํ๋ฅผ ๊ตฌํํ์๋ค.
๋๋กํฌ์ฅ์ ๋ค์ต์คํธ๋ผ์ dp ๋ฅผ ๊ณ๋ค์ธ ๋ฌธ์ ๋ค ๐
๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ์์ฝํ๋ฉด,
์๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง๋ฉด
1๋ฒ ๋
ธ๋์์ N ๋ฒ ๋
ธ๋๋ก ์ต๋จ ๊ฒฝ๋ก๋ก ์์ง์ฌ์ผ ํ๋ค.
์ด๋, ์ข ๋ ๋น ๋ฅด๊ฒ ์์ง์ด๊ธฐ ์ํด **๋๋ก ํฌ์ฅ** ์ k ๋ฒ ์ํํ ์ ์๋ค.
๋๋ก ํฌ์ฅ์ ์ํํ๋ฉด, ํด๋น ๋๋ก์ ๊ฐ์ค์น๋ฅผ 0์ผ๋ก ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค.
์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ๋ ๊ฒ์,
์ฃผ์ด์ง k ๋ฒ ์ดํ์ ๋๋ก ํฌ์ฅ์ ์ํํ์ ๋ ๋ชฉ์ ์ง์ ๋๋ฌํ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
(๋๋ก ํฌ์ฅ์ ํ ๋ฒ๋ ์ํ๋ ๊ฒ ์ต๋จ ๊ฒฝ๋ก์ผ ์๋ ์๋ค.)
---
๋ค์ต์คํธ๋ผ์์๋ dist ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ์ ์ธํ์ฌ, ๊ฐ ๋
ธ๋๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ค.
ํ์ง๋ง ์ด๋ฒ์๋ ๋๋ก๋ฅผ ํฌ์ฅํ๋์ง, ํ๋ค๋ฉด ๋ช ๋ฒ ํ๋์ง ๊น์ง ๊ณ ๋ คํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํด์ผํ๋ค.
dist ๋ฐฐ์ด์ ์๊ฐํด๋ณด๋ฉด, ๋ค์ต์คํธ๋ผ๋ฅผ ํตํด ๋
ธ๋๋ฅผ ํ์ํ๋ฉด์ ๊ณ์ update ํ๋ค.
์ง๊ธ๊น์ง ๊ฑธ์ด์จ ์ต๋จ๊ฒฝ๋ก(sub problem)์ ์์ผ๋ก ๊ฐ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋น๊ตํ์ฌ update ํด์ ์ต์ข
์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ป๋๋ค. -> ์ฌ๊ธฐ์ dp ์ ๊ฐ๋
์ด ์ฒจ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ํ๋ ๋ ๋์๊ฐ์
์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ ๋, ์์ผ๋ก ๊ฐ ๋๋ก๋ฅผ ํฌ์ฅํ๋ ์ผ์ด์ค์ ํ์ง ์๋ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด๋ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น..?
์ฌ์ค, ์ ํด๋ณด์ง ์์ผ๋ฉด ๋ ์ฌ๋ฆฌ๊ธฐ ํ๋ ๊ฒ ๊ฐ๋ค..
๋ต์ i ๋ฒ ๋
ธ๋์ ๋๋ฌํ์ ๋๊น์ง์ ๋๋ก ํฌ์ฅ ํ์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ฏ๋ก
dist ๋ฐฐ์ด์ ๋๋ก ํฌ์ฅ ํ์๋ฅผ ๋ํ๋ด๋ ์ฐจ์์ ์ถ๊ฐํ๊ณ
Node ์๋ ๋๋ก ํฌ์ฅ ํ์๋ฅผ ๋ํ๋ด๋ ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ๋ ์๋์ ๊ฐ์ด ๋์ํ๋ค.
while(pq๊ฐ ๋น๋๊น์ง){
now ๋ ํ์ฌ ๋ด๊ฐ ์ ์๋ ๋
ธ๋
for( now ์ ์ฐ๊ฒฐ๋ ๋
ธ๋ iter ์ ํ์) {
if( now ์์ iter ์ผ๋ก ๊ฐ๋๊ฒ ์ต๋จ ๊ฒฝ๋ก์ด๋ฉด){
iter ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ, now ๊น์ง์ ์ต๋จ๊ฒฝ๋ก + iter ์ ๊ฐ์ค์น๋ก ๊ฐฑ์
pq ์ ์ถ๊ฐ
}
}
์ฌ๊ธฐ์ ํฌ์ฅ ํ์๋ฅผ ๋ฐ๋ก ๊ณ ๋ คํ๋ฉด,
while(pq๊ฐ ๋น๋๊น์ง){
now ๋ ํ์ฌ ๋ด๊ฐ ์ ์๋ ๋
ธ๋
for( now ์ ์ฐ๊ฒฐ๋ ๋
ธ๋ iter ์ ํ์) {
if( now ์ ํฌ์ฅ ํ์์ธ now.cnt ๊ฐ k ๋ณด๋ค ์์์, ๋๋ก๋ฅผ ํฌ์ฅํ ์ ์๋ค๋ฉด && ๋๋ก๋ฅผ ํฌ์ฅํ์ ๋ ๋ ๋นจ๋ฆฌ ๋๋ฌํ ์ ์๋ค๋ฉด){
now.cnt+1 ๋งํผ ๋๋ก ํฌ์ฅ์ ์ํํ, iter ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ update
pq ์ ์ถ๊ฐ
}
if( now.cnt ๊ฐ k ์ด์์ด๋ผ์ ๋๋ก๋ฅผ ๋์ด์ ํฌ์ฅํ ์ ์๋ค๋ฉด && iter ์ผ๋ก ๊ฐ๋ ๊ฒ ๋ ์งง์ ๊ฑฐ๋ฆฌ๋ผ๋ฉด){
now.cnt ๋งํผ ๋๋ก ํฌ์ฅ์ ์ํํ, iter ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ update
pq ์ ์ถ๊ฐ
}
}
์์ ๊ฐ์ด ๋ค์ต์คํธ๋ผ๋ฅผ ๋ณํํ์ฌ ๊ตฌํํ ์ ์๋ค.
๊ทผ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด ๋์ถฉ 40~50% ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ ๊ฒ์ด๋ค. ๐ซ
pq ์ ๋๋ฌด ๋ง์ ๋
ธ๋๊ฐ ๋ค์ด๊ฐ๋ค๋๊ฐ ํด์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ผํ
๋ฐ...
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ค๋ณต๋ ์ฐ์ฐ์ ์ค์ฌ์ฃผ์ด์ผ ํ๋ค.
์ฆ, ํ์ํ์ง ์์๋ ๋ ๋
ธ๋๋ฅผ cut ํ์ฌ ์๊ฐ์ ์ต์ ํํ๋ ๊ณผ์ ์ด ํ๋ ๋ ํ์ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฏธ ์ฒ๋ฆฌํ ๋ ธ๋๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ก ์กฐ๊ฑด์ ํ๋ ๋ ์ถ๊ฐํด์ผ ํ๋ค!
---
import java.io.*;
import java.util.*;
public class Main {
static int n; // ๋
ธ๋
static int m; // ์ฃ์ง
static int k; // ํฌ์ฅํ ๋๋ก ๊ฐ์
static long[][] dist;
static ArrayList<Node>[] graph;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = Integer.parseInt(stk.nextToken());
m = Integer.parseInt(stk.nextToken());
k = Integer.parseInt(stk.nextToken());
graph = new ArrayList[n + 1];
for (int i = 0; i <= n; i++) {
graph[i] = new ArrayList<>();
}
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 w = Integer.parseInt(stk.nextToken());
graph[a].add(new Node(b, w, 0));
graph[b].add(new Node(a, w, 0));
}
dist = new long[n + 1][k + 1];
for (int i = 0; i <= n; i++) {
Arrays.fill(dist[i], Long.MAX_VALUE);
}
dist[1][0] = 0;
// do dijkstra
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(1, 0, 0));
while (!pq.isEmpty()) {
Node now = pq.poll();
if (now.w > dist[now.to][now.cnt])
continue;
for (Node iter : graph[now.to]) {
if (now.cnt < k && dist[iter.to][now.cnt + 1] > dist[now.to][now.cnt]) {
dist[iter.to][now.cnt + 1] = dist[now.to][now.cnt];
pq.add(new Node(iter.to, dist[iter.to][now.cnt + 1], now.cnt + 1));
}
if (dist[iter.to][now.cnt] > dist[now.to][now.cnt] + iter.w) {
dist[iter.to][now.cnt] = dist[now.to][now.cnt] + iter.w;
pq.add(new Node(iter.to, dist[iter.to][now.cnt], now.cnt));
}
}
}
long ans = Long.MAX_VALUE;
for (int i = 0; i <= k; i++) {
ans = Math.min(dist[n][i], ans);
}
bw.write(ans + "\n");
bw.flush();
bw.close();
}
static class Node implements Comparable<Node> {
int to;
long w;
int cnt;
public Node(int to, long w, int cnt) {
this.to = to;
this.w = w;
this.cnt = cnt;
}
@Override
public int compareTo(Node o) {
return (int) (this.w - o.w);
}
}
}
'๐ฅ Algorithm || ๋ฌธ์ ํ์ด > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 15681] ํธ๋ฆฌ์ ์ฟผ๋ฆฌ (ํธ๋ฆฌ DP) (2) | 2023.06.07 |
---|---|
[๋ฐฑ์ค 9019] DSLR ์๋ฐ(BFS + ๊ฒฝ๋ก ์ถ์ ) (0) | 2023.06.03 |
[InOrder ์ PostOrder ๋ก๋ถํฐ PreOrder ๊ตฌํ๊ธฐ] ๋ฐฑ์ค 2263 ํธ๋ฆฌ์ ์ํ (JAVA) (0) | 2023.03.22 |
[ํธ๋ฆฌ์ ์ง๋ฆ ๊ตฌํ๊ธฐ] ๋ฐฑ์ค 1167 (JAVA) - dfs / ๋ค์ต์คํธ๋ผ (0) | 2023.03.20 |
[Union and Find] ๋ฐฑ์ค 20040 ์ฌ์ดํด ๊ฒ์ (0) | 2023.03.07 |