https://www.acmicpc.net/problem/1753
1753๋ฒ: ์ต๋จ๊ฒฝ๋ก
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋ ์ ์ ์๋ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๋์งธ ์ค์๋ ์์ ์ ์ ์ ๋ฒํธ K(1 ≤ K ≤ V)๊ฐ
www.acmicpc.net
์ค๋ต๋ ธํธ(ํธ๋ ๋์ ์ฌ๊ณ ๊ณผ์ ๋ฐ ๊ฐ์ ์ )
๋ค์ต์คํธ๋ผ๋ก ํ๋ฉด ๋๋ค.
๋ด๊ฐ ๊ทธ๋ํ๋ฅผ ์ตํ๋ ๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ๋ ํธ์ด๋ผ ํ์ค ํ์ค ๋ถํดํด์ ์์ฑํ๊ฒ ๋ค.
static class Node {
int end, w;
Node(int end, int w) {
this.end = end;
this.w = w;
}
}
๋ค์ต์คํธ๋ผ๋ ์์์ ์ ์์ ๋ชฉํ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ค. ๊ฐ ์ ์ ๋ณ Node๋ฅผ ๊ฐ๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ถ๋ฐ ์ง์ ์ ํ์์๋ค. end๊น์ง ๊ฐ๋ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ w๋ค.
static int v, e;
static List<Node>[] list;
static int[] dist;
static PriorityQueue<Node> pq;
์ ์ ์ ๋ณด๋ฅผ ๋ฐ์(start๋ก ์ฌ์ฉํ ) v - e(end๋ก ์ฌ์ฉํ )๊ฐ ์๊ณ , Node๋ฅผ ์์๋กํ๋ list๋ฅผ ๋ง๋ ๋ค.
๊ฐ ์ถ๋ฐ์ง์ ์์ ํ์ฌ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ dist, ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ์ ์ ์ ์ฝ๊ฒ ์ ์ดํ๊ธฐ ์ํ ์ฐ์ ์์ ํ๋ฅผ ์ ์ธํด์ค๋ค.
int INF = 100000000;
list = new ArrayList[v + 1];
dist = new int[v + 1];
Arrays.fill(dist, INF);
for (int i = 1; i <= v; i++) {
list[i] = new ArrayList<>(); // ๊ฐ ๋
ธ๋(์ ์ )์ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ ์์ฑ
}
pq = new PriorityQueue<Node>((o1, o2) -> {
return o1.w - o2.w;
});
์ด๊ธฐํ ์์ ์ด๋ค. INF๋ ๋ค์ต์คํธ๋ผ ์ด๋ก ์์ ๋ณผ์์๋ ๋ฌดํ๋ ๊ฐ์ ๋ฃ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๊ฐ ์ ์๋ ๊ธธ์ ํ์ํ๊ธฐ ์ํ ์ด๊ธฐํ ์์ ์ด๋ค. ์ ์ ๋ฒํธ๋ฅผ ๊ทธ๋๋ก index๋ก ์ฐ๊ธฐ ์ํด์ v+1๋ก ์ฌ์ด์ฆ๋ฅผ ์ก์์ค๋ค. ์ฐธ๊ณ ๋ก list์ ์์ ๊ฐ๊ฐ์ Node๋ฅผ ์์๋ก ํ๋ list๊ฐ ๋๋ค. ์ธ์ ๋ฆฌ์คํธ ๊ฐ๋ ๊ณผ ๋์ผํ๋ค.
๊ฐ ๋ฆฌ์คํธ์ ์์์๋ ArrayList๋ฅผ ์ด๊ธฐํ ํด์ค์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด๊ฑธ ํ์ง์์ผ๋ฉด null๋ก ๋จ์์๋ค.
// ๊ฐ์ ๊ฐ์
for (int i = 0; i < e; i++) {
st = new StringTokenizer(br.readLine(), " ");
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
// from์์ to๋ก ๊ฐ๋ weight ๊ฐ์ค์น
list[from].add(new Node(to, w));
}
์์ ์ ์ ์ ๋ฆฌ์คํธ์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๊ฐ์ค์น์ ํจ๊ป ๋ด๋๋ค. ์ด๊ฒ ์ ์ผ ์ค์ํ๋ค.
์ด์ ๋ค์ต์คํธ๋ผ ๊ตฌํ ์ฝ๋๋ฅผ ๋ณด๊ฒ ๋ค.
private static void dijkstra(int start) {
boolean[] check = new boolean[v + 1]; // ํ์ ๋ ๋
ธ๋๋ฅผ ํ์ํจ
pq.add(new Node(start, 0));
dist[start] = 0;
while (!pq.isEmpty()) {
Node curNode = pq.poll();
int cur = curNode.end;
if (check[cur] == true)
continue;
check[cur] = true;
for (Node node : list[cur]) {
if (dist[node.end] > dist[cur] + node.w) {
dist[node.end] = dist[cur] + node.w;
pq.add(new Node(node.end, dist[node.end]));
}
}
}
}
check ๋ฐฐ์ด๋ dist์ ๋์ผํ ํฌ๊ธฐ๋ก ๋ง๋ค์ด์ฃผ๊ณ , ์์ ์ ์ ์ pq์ ๋ฃ์ผ๋ฉด์ ์์ํ๋ค.
์์ ์ ์ ์์ ์์์ ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ค์น๋ 0์ด๋ค. ๋ฐ๋์ ๋ชจ๋ ์ ์ ์ด ๊ฒฝ์ ์ง๋ผ๋ ์๊ฐ์ ํด์ผ ์ดํด๊ฐ ๋นจ๋ผ์ง๋ค.
๋ค์ต์คํธ๋ผ์ ๊ฐ์ค์น๋ฅผ ์์ ๋ฉด ์ผ๋ฐ BFS๊ฐ ๋๋ค. ๊ทธ๋์ ๊ตฌ์กฐ ์์ฒด๋ ๋น์ทํ๋ค.
ํ์ฌ ๋ ธ๋์์ ๋์ฐฉํ ์ ์ ์ end๋ก ๊ฐ๊ณ ์จ๋ค. ๋ง์ฝ ๋ฐฉ๋ฌธํ ์ ์ ์ด๋ผ๋ฉด loop๋ฅผ continueํ๊ณ ๋ค์ ๋ ธ๋๋ฅผ ๋ฝ๋๋ค.
๋ฐฉ๋ฌธ์ง์์์ผ๋ฉด ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ๊ณ , ๋์ฐฉํ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ๋ค์ ๋ค ๋๋ฉด์, ํ์ฌ ์ ์ ์ ๊ฒฝ์ ํด์ ๊ฐ ๊ฑฐ๋ฆฌ(๊ฐ์ค์น)๊ฐ ๋ ๊ฐ๊น๋ค๋ฉด ๊ฐฑ์ ํด์ฃผ๊ณ pq์ ํ์ฌ ๋์ฐฉํ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ , ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฃ์ด์ค๋ค.
์ ๋ต์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static class Node {
int end, w;
Node(int end, int w) {
this.end = end;
this.w = w;
}
}
static int v, e;
static List<Node>[] list;
static int[] dist;
static PriorityQueue<Node> pq;
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("res/boj.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
v = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(br.readLine());
int INF = 100000000;
list = new ArrayList[v + 1];
dist = new int[v + 1];
Arrays.fill(dist, INF);
for (int i = 1; i <= v; i++) {
list[i] = new ArrayList<>(); // ๊ฐ ๋
ธ๋(์ ์ )์ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ ์์ฑ
}
pq = new PriorityQueue<Node>((o1, o2) -> {
return o1.w - o2.w;
});
// ๊ฐ์ ๊ฐ์
for (int i = 0; i < e; i++) {
st = new StringTokenizer(br.readLine(), " ");
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
// from์์ to๋ก ๊ฐ๋ weight ๊ฐ์ค์น
list[from].add(new Node(to, w));
}
dijkstra(s);
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= v; i++){
if(dist[i] == INF) sb.append("INF\n");
else sb.append(dist[i]).append("\n");
}
System.out.println(sb);
}
private static void dijkstra(int start) {
boolean[] check = new boolean[v + 1]; // ํ์ ๋ ๋
ธ๋๋ฅผ ํ์ํจ
pq.add(new Node(start, 0));
dist[start] = 0;
while (!pq.isEmpty()) {
Node curNode = pq.poll();
int cur = curNode.end;
if (check[cur] == true)
continue;
check[cur] = true;
for (Node node : list[cur]) {
if (dist[node.end] > dist[cur] + node.w) {
dist[node.end] = dist[cur] + node.w;
pq.add(new Node(node.end, dist[node.end]));
}
}
}
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์ค๋ต๋ ธํธ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][JAVA] 31418: ์คํ์ง (0) | 2025.02.09 |
---|---|
[BOJ][JAVA] 2559๋ฒ: ์์ด, 1912๋ฒ: ์ฐ์ํฉ, 2304๋ฒ: ์ฐฝ๊ณ ๋ค๊ฐํ - ๋์ ํฉ (0) | 2024.09.27 |
[BOJ][JAVA] 1149๋ฒ, 17404๋ฒ : RGB ๊ฑฐ๋ฆฌ1, RGB ๊ฑฐ๋ฆฌ2 (0) | 2024.03.19 |
[BOJ][JAVA] 7576๋ฒ : ํ ๋งํ (0) | 2024.03.19 |
[BOJ][JAVA] 17822๋ฒ: ์ํ๋๋ฆฌ๊ธฐ (0) | 2024.03.17 |