๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/11779)
< ์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2 >
๋ฌธ์ ํ์ด
๋ฐ์ดํฌ์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ค.
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 _11779_ { // ์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2
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 n = Integer.parseInt(bf.readLine());
int m = Integer.parseInt(bf.readLine());
ArrayList<ArrayList<int[]>> list = new ArrayList<>();
Node result[] = new Node[n + 1];
for (int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
result[i] = new Node(i, Integer.MAX_VALUE, new ArrayList<>());
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
list.get(start).add(new int[] { end, cost });
}
st = new StringTokenizer(bf.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
PriorityQueue<Node> queue = new PriorityQueue<>();
ArrayList<Integer> temp = new ArrayList<>();
temp.add(start);
queue.add(new Node(start, 0, temp));
while (!queue.isEmpty()) {
Node node = queue.poll();
if(node.d > result[node.node].d) {
continue;
}
for (int i = 0; i < list.get(node.node).size(); i++) {
int info[] = list.get(node.node).get(i);
if (node.d + info[1] < result[info[0]].d) {
ArrayList<Integer> route = new ArrayList<>();
result[info[0]].d = node.d + info[1];
result[info[0]].list.clear();
for (int j = 0; j < node.list.size(); j++) {
route.add(node.list.get(j));
result[info[0]].list.add(node.list.get(j));
}
result[info[0]].list.add(info[0]);
route.add(info[0]);
queue.add(new Node(info[0], node.d + info[1], route));
}
}
}
bw.write(result[end].d + "\n");
bw.write(result[end].list.size() + "\n");
for (int i = 0; i < result[end].list.size(); i++) {
bw.write(result[end].list.get(i) + " ");
}
bw.flush();
}
}
๋ณ์)
Node : ๋์ ๋ฒํธ, ๋น์ฉ, ๊ฒฝ๋ก
n, m : ๋์์ ๊ฐ์, ๋ฒ์ค์ ๊ฐ์
list : ๋ฒ์ค์ ์ ๋ณด
result : ์ถ๋ฐ ๋์์์ ๊ฐ ๋์๋ก ๊ฐ๋ ์ต์ ๋น์ฉ
start, end cost : ์ถ๋ฐ ๋์ ๋ฒํธ, ๋์ฐฉ์ง์ ๋์ ๋ฒํธ, ๋ฒ์ค ๋น์ฉ
start, end : ์ถ๋ฐ์ ์ ๋์ ๋ฒํธ, ๋์ฐฉ์ ์ ๋์ ๋ฒํธ
queue : ์ฐ์ ์์ ํ
temp : ์ถ๋ฐ์ ๋ถํฐ ๊ฒฝ๋ก ์ ์ฅํ๋ ArrayList
Node
๋์ ๋ฒํธ, ๋ฒ์ค ๋น์ฉ, ๊ฒฝ๋ก๋ฅผ ๋ณ์๋ก ๊ฐ์ง๋ค. ์ฐ์ ์์๋ ๋น์ฉ์ด ์์ ๊ฒ์ ์ฐ์ ์ผ๋ก ํ๋ค.
Main
๋์์ ๊ฐ์์ ๋ฒ์ค์ ๊ฐ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. ๋ฒ์ค์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ArrayList์ ์ ์ฅํ๋ค.
์ถ๋ฐ ๋์๋ฅผ ๋น์ฉ 0, ๊ฒฝ๋ก๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ์ง Node๋ก ๋ง๋ค์ด ์ฐ์ ์์ ํ์ ์ ์ฅํ ํ ์ฐ์ ์์ ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต๋ฌธ์ ์คํํ๋ค. ์ฐ์ ์์ํ์์ ๊บผ๋ธ ๊ฐ์ด ํ์ฌ๊น์ง์ ์ต์ ๋น์ฉ๋ณด๋ค ๊ฐ์ด ํฌ๋ค๋ฉด ๋ค์ ๋์๊ฐ๋ค. ํฌ์ง ์๋ค๋ฉด ๋์์ ์ฐ๊ฒฐ๋ ๋ฒ์ค๋ฅผ ํ์ํ๊ณ ์ต์ ๋น์ฉ์ผ๋ก ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๊ฐ๋ค์ ์ ๋ฐ์ดํธ ํ ์ฐ์ ์์ ํ์ ๋ฃ์ด์ค๋ค.
์ต์ข ์ถ๋ฐ ๋์์์ ๋์ฐฉ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ์ต์ ๋น์ฉ๊ณผ ๊ฒฝ๋ก์ ํฌํจ๋์ด ์๋ ๋์์ ๊ฐ์, ๋ฐฉ๋ฌธํ๋ ๋์๋ฅผ ์์๋๋ก ์ถ๋ ฅํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 9694_๋ฌด์์ ์๋๋๊ฐ ์๋๋ผ ๋๊ตฌ๋ฅผ ์๋๋๊ฐ ๋ฌธ์ ๋ค (1) | 2024.01.11 |
---|---|
[Baekjoon] 1719_ํ๋ฐฐ (0) | 2024.01.10 |
[Baekjoon] 1238_ํํฐ (1) | 2024.01.08 |
[Baekjoon] 1895_ํํฐ (1) | 2024.01.05 |
[Baekjoon] 2890_์นด์ฝ (1) | 2024.01.04 |