์ต๋จ๊ฒฝ๋ก - ๋ค์ต์คํธ๋ผ (Lv. Gold4)
1. ๋ฌธ์
2. ํ์ด
1. ๋ฌธ์
https://www.acmicpc.net/problem/1753
2. ํ์ด
import java.util.*;
import java.io.*;
class Node {
int end;
int weight;
public Node(int end, int weight) {
this.end = end;
this.weight = weight;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(br.readLine());
boolean[] visit = new boolean[V + 1];
int[] result = new int[V + 1];
List<Node>[] list = new List[V + 1];
for (int i = 0; i <= V; i++) {
list[i] = new ArrayList<>();
result[i] = Integer.MAX_VALUE;
}
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
list[u].add(new Node(v, w));
}
PriorityQueue<Node> queue = new PriorityQueue<>((o1, o2) -> o1.weight - o2.weight);
result[K] = 0;
queue.add(new Node(K, 0));
while (!queue.isEmpty()) {
Node now = queue.poll();
if (visit[now.end]) continue;
visit[now.end] = true;
for (Node next : list[now.end]) {
if (!visit[next.end] && result[now.end] + next.weight < result[next.end]) {
result[next.end] = result[now.end] + next.weight;
queue.add(new Node(next.end, result[next.end]));
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= V; i++) {
if (result[i] == Integer.MAX_VALUE) sb.append("INF\n");
else sb.append(result[i]).append("\n");
}
System.out.print(sb);
}
}
- PriorityQueue<Node> queue = new PriorityQueue<>((o1, o2) -> o1.weight - o2.weight);
์ฐ์ ์์ ํ์์ ๋น๊ตํ ๊ธฐ์ค์ ์ ์ํฉ๋๋ค.
o1๊ณผ o2๋ Node ๊ฐ์ฒด ๋ ๊ฐ์ด๊ณ , ์ฐ์ ์์ ํ๋ o1๊ณผ o2๋ฅผ ๋น๊ตํ์ฌ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ ์ฐ์ ์์๊ฐ ๋์์ง ๊ฒฐ์ ํฉ๋๋ค.
o1.weight๊ฐ o2.weight ๋ณด๋ค ์์ผ๋ฉด ์ฐ์ ์์๊ฐ o1์ด ๋ ๋์ต๋๋ค.
- queue.add(new Node(K, 0));
์ฐ์ ์์ ํ์ Node(K, 0)์ ์ถ๊ฐํฉ๋๋ค.
์์์ ์ ๊ฐ์ค์น๋ 0์ผ๋ก ์ค์ ๋๊ณ ๊ทธ ๋ ธ๋๋ถํฐ ํ์์ ํ๊ฒ ๋ฉ๋๋ค.
- if (visit[now.end]) continue;
ํ๊ฐ ๋น์ง ์์ผ๋ฉด ๋ฐ๋ณตํฉ๋๋ค. queue.poll()์ ํตํด ์ฐ์ ์์ ํ์์ ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ๋ ธ๋๋ฅผ ๊บผ๋ ๋๋ค.
visit[now.end]๊ฐ true๋ผ๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋์ด๋ฏ๋ก ๊ฑด๋๋ฐ๊ณ ์๋ก์ด ๋ ธ๋๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
for (Node next : list[now.end]) {
if (!visit[next.end] && result[now.end] + next.weight < result[next.end]) {
result[next.end] = result[now.end] + next.weight;
queue.add(new Node(next.end, result[next.end]));
}
}
list[now.end]๋ ํ์ฌ now.end ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ค์ ๋ด๊ณ ์๋ ๋ฆฌ์คํธ์ ๋๋ค.
Node next๋ now.end์์ ์ถ๋ฐํ๋ ๊ฐ๊ฐ์ ์ธ์ ๋ ธ๋์ ๊ทธ ๋ ธ๋๊น์ง ๊ฐ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๋ํ๋ ๋๋ค.
visit[next.end]๊ฐ false์ผ ๊ฒฝ์ฐ์ ์์ง ๋ฐฉ๋ฌธ์ ํ์ง ์์๋ค๋ ๋ป์ด๋ฏ๋ก !visit[next.end]๋ฅผ ํด์ true๋ก ๋ฐํํ์ฌ ๋ฐฉ๋ฌธ์ ํ ์ ์์ต๋๋ค.
ํ์ฌ now.end์์ next.end๊น์ง ๊ฐ๋ ๊ฒฝ๋ก์ ์ด ๋น์ฉ๊ณผ next.end๊น์ง ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฒฝ๋ก๋ณด๋ค ์งง์ผ๋ฉด ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
๊ฐฑ์ ๋ result[next.add] ๊ฐ์ ๋ฐํ์ผ๋ก next.end ๋ ธ๋๋ฅผ ์ฐ์ ์์ ํ์ ์ถ๊ฐํฉ๋๋ค.
๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์ !
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค <3