๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/9694)
< ๋ฌด์์ ์๋๋๊ฐ ์๋๋ผ ๋๊ตฌ๋ฅผ ์๋๋๊ฐ ๋ฌธ์ ๋ค >
๋ฌธ์ ํ์ด
๋ฐ์ดํฌ์คํธ๋ผ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class _9694_ { // ๋ฌด์์ ์๋๋๊ฐ ์๋๋ผ ๋๊ตฌ๋ฅผ ์๋๋๊ฐ ๋ฌธ์ ๋ค
static class Node implements Comparable<Node> {
private int node;
private int d;
private ArrayList<Integer> list;
public Node(int node, int d, ArrayList<Integer> list) {
this.node = node;
this.d = d;
this.list = list;
}
@Override
public int compareTo(Node o) {
return this.d - o.d;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int t = Integer.parseInt(bf.readLine());
ArrayList<ArrayList<int[]>> list = new ArrayList<>();
Node answer[];
for (int i = 0; i < t; i++) {
st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
answer = new Node[m];
for (int j = 0; j < m; j++) {
list.add(new ArrayList<>());
ArrayList<Integer> temp = new ArrayList<>();
temp.add(j);
answer[j] = new Node(j, Integer.MAX_VALUE, temp);
}
for (int j = 0; j < n; j++) {
st = new StringTokenizer(bf.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int z = Integer.parseInt(st.nextToken());
list.get(x).add(new int[] { y, z });
list.get(y).add(new int[] { x, z });
}
PriorityQueue<Node> queue = new PriorityQueue<>();
ArrayList<Integer> temp = new ArrayList<>();
temp.add(0);
answer[0].d = 0;
queue.add(new Node(0, 0, temp));
while (!queue.isEmpty()) {
Node node = queue.poll();
if (answer[node.node].d < node.d) {
continue;
}
for (int j = 0; j < list.get(node.node).size(); j++) {
int info[] = list.get(node.node).get(j);
if (answer[info[0]].d > node.d + info[1]) {
answer[info[0]].d = node.d + info[1];
answer[info[0]].list.clear();
ArrayList<Integer> route = new ArrayList<>();
for (int k = 0; k < node.list.size(); k++) {
answer[info[0]].list.add(node.list.get(k));
route.add(node.list.get(k));
}
answer[info[0]].list.add(info[0]);
route.add(info[0]);
queue.add(new Node(info[0], node.d + info[1], route));
}
}
}
bw.write("Case #" + (i + 1) + ": ");
if (answer[m - 1].d == Integer.MAX_VALUE) {
bw.write("-1\n");
} else {
for (int j = 0; j < answer[m - 1].list.size(); j++) {
bw.write(answer[m - 1].list.get(j) + " ");
}
bw.write("\n");
}
list.clear();
}
bw.flush();
}
}
๋ณ์)
Node : ๋ฒํธ, ์น๋ฐ๋, ๋ง๋ ์์
t : ํ ์คํธ์ผ์ด์ค ์
list : ์ ์น์ธ๋ค ๊ฐ์ ์น๋ฐ๋ ๊ด๊ณ
answer : 0๋ฒ์์ ๊ฐ ์ ์น์ธ๊น์ง ์น๋ฐ๋
n, m : ๊ด๊ณ์ ๊ฐ์, ์ ์น์ธ์ ์
x, y, z : ์ ์น์ธ x, ๊ทธ์ ์น๊ตฌ y, ๋ ์ฌ๋ ๊ฐ์ ์น๋ฐ๋
queue : Node๋ฅผ ๊ฐ์ง ์ฐ์ ์์ ํ (์น๋ฐ๋๊ฐ ๋ฎ์ ๊ฒ์ ์ฐ์ ์์๋ก ๊ฐ์ง)
Node
์ ์น์ธ์ ๋ฒํธ, ์น๋ฐ๋, ๋ง๋ ์์๋ฅผ ๋ณ์๋ก ๊ฐ์ง. ์ฐ์ ์์๋ ์น๋ฐ๋๊ฐ ๋ฎ์ ๊ฒ์ ์ฐ์ ์ผ๋ก ํจ
Main
ํ ์คํธ์ผ์ด์ค ์๋งํผ 0๋ฒ์์ m-1๋ฒ๊น์ง ๋ฎ์ ์น๋ฐ๋๋ฅผ ๊ฐ์ง ์ ์๋ ๋ง๋ ์์๋ฅผ ๊ตฌํ๋ค.
์ ์น์ธ๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ๋ ฅ๋ฐ์ list์ ์๋ฐฉํฅ์ผ๋ก ์ ์ฅํ๋ค.
์ฐ์ ์์ ํ์ 0๋ฒ์ ๋ฃ์ด ์น๋ฐ๋๋ฅผ ๊ตฌํ๋ค. ์ฐ์ ์์ ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ค. ์ฐ์ ์์ ํ์์ ๊ฐ์ ๊บผ๋ด ์์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ ์น์ธ๋ค์ ์ดํด๋ณด๋ฉฐ ์น๋ฐ๋์ ํฉ์ด ํ์ฌ ์ ์ฅ๋ ์น๋ฐ๋๋ณด๋ค ์์ ๊ฐ์ด๋ผ๋ฉด ๊ฐ์ ์ ๋ฐ์ดํธํ๋ฉฐ ์ฐ์ ์์ ํ์ ์ ์ฅํ๋ค.
answer์ m-1๋ฒ์งธ ์น๋ฐ๋ ๊ฐ์ด Integer.MAX_VALUE๋ผ๋ฉด ์ต๊ณ ์์์ ๋ง๋ ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก -1์ ์ถ๋ ฅํ๊ณ Integer.MAX_VALUE๊ฐ ์๋๋ผ๋ฉด answer์ m-1๋ฒ์งธ์ ์ ์ฅ๋ list์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 10384_ํฌ๊ทธ๋จ (0) | 2024.01.15 |
---|---|
[Baekjoon] 1865_์ํ (0) | 2024.01.12 |
[Baekjoon] 1719_ํ๋ฐฐ (0) | 2024.01.10 |
[Baekjoon] 11779_์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2 (0) | 2024.01.09 |
[Baekjoon] 1238_ํํฐ (1) | 2024.01.08 |