๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1238)
< ํํฐ >
๋ฌธ์ ํ์ด
๋ฐ์ดํฌ์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ๋จผ์ n๋ฒ์งธ ๋ง์์์ x๋ฒ์งธ ๋ง์๋ก ๊ฐ๋ ์ต๋จ ์๊ฐ์ ๊ตฌํ๋ค. ๊ทธ ํ์ ๋ค์ x๋ฒ์งธ ๋ง์์์ n๋ฒ์งธ ๋ง์๋ก ๊ฐ๋ ์ต๋จ ์๊ฐ์ ๊ตฌํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class _1238_ { // ํํฐ
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
ArrayList<ArrayList<int[]>> list = new ArrayList<>();
for (int i = 0; i < n + 1; i++) {
list.add(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 t = Integer.parseInt(st.nextToken());
list.get(start).add(new int[] { end, t });
}
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
int answer = 0;
for (int i = 1; i <= n; i++) {
int arr[] = new int[n + 1];
int result[] = new int[n + 1];
for (int j = 1; j < n + 1; j++) {
arr[j] = Integer.MAX_VALUE;
result[j] = Integer.MAX_VALUE;
}
if (i == x) {
continue;
}
arr[i] = 0;
queue.add(new int[] { i, 0 });
while (!queue.isEmpty()) {
int num[] = queue.poll();
for (int j = 0; j < list.get(num[0]).size(); j++) {
if (arr[list.get(num[0]).get(j)[0]] > num[1] + list.get(num[0]).get(j)[1]) {
arr[list.get(num[0]).get(j)[0]] = num[1] + list.get(num[0]).get(j)[1];
queue.add(new int[] { list.get(num[0]).get(j)[0], num[1] + list.get(num[0]).get(j)[1] });
}
}
}
result[x] = arr[x];
queue.add(new int[] { x, result[x] });
while (!queue.isEmpty()) {
int num[] = queue.poll();
for (int j = 0; j < list.get(num[0]).size(); j++) {
if (result[list.get(num[0]).get(j)[0]] > num[1] + list.get(num[0]).get(j)[1]) {
result[list.get(num[0]).get(j)[0]] = num[1] + list.get(num[0]).get(j)[1];
queue.add(new int[] { list.get(num[0]).get(j)[0], num[1] + list.get(num[0]).get(j)[1] });
}
}
}
if (answer < result[i]) {
answer = result[i];
}
}
System.out.println(answer);
}
}
๋ณ์)
n, m, x : ํ์ ์, ๋จ๋ฐฉํฅ ๋๋ก ๊ฐ์, ํํฐํ๋ ๋ง์
list : ๊ฐ ๋ง์์ ์ฐ๊ฒฐ๋ ๋๋ก
start, end, t : ์์์ , ๋์ , ํ์ํ ์์ ์๊ฐ
queue : ์ฐ์ ์์ ํ [๋ง์ ๋ฒํธ, ์๊ฐ]
answer : ์ค๊ณ ๊ฐ๋๋ฐ ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ํ์์ ์์ ์๊ฐ
arr : n๋ฒ์งธ ๋ง์ -> x๋ฒ์งธ ๋ง์ ์ต๋จ ์๊ฐ
result : x๋ฒ์งธ ๋ง์ -> n๋ฒ์งธ ๋ง์ ์ต๋จ ์๊ฐ
๋๋ก์ ์์์ , ๋์ , ์ด ๋๋ก๋ฅผ ์ง๋๋๋ฐ ํ์ํ ์์ ์๊ฐ์ ์ ๋ ฅ๋ฐ์ ArrayList๋ฅผ ์ฌ์ฉํด์ ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋ค. ๋ชจ๋ ํ์์ด x์ ๊ฐ๋ค๊ฐ ์ง์ผ๋ก ๋์์ค๋ ์๊ฐ์ ๊ตฌํด์ผ ํ๋ฏ๋ก ํ ๋ช ์ฉ ๋ค ์ต๋จ ์๊ฐ์ ๊ตฌํ๋๋ก ํ๋ค.
๋จผ์ ๋ฐฐ์ด์ Integer.MAX_VALUE๋ก ์ด๊ธฐํํ๋ค. x๋ฒ ๋ง์์ ์๋ ํ์์ ์ต๋จ ์๊ฐ์ ๊ตฌํ ํ์ ์์ผ๋ฏ๋ก ๋์ด๊ฐ๋ค. i๋ฒ์งธ ํ์์ด x๋ฒ ๋ง์๋ก ๊ฐ๋๋ฐ ์ต๋จ ์๊ฐ์ ๊ตฌํ๋ค. ๊ทธ ํ x๋ฒ ๋ง์์์ i๋ฒ ๋ง์๋ก ๋์๊ฐ๋ ์ต๋จ ์๊ฐ์ ๊ตฌํ๋ค. i๋ฒ ๋ง์๋ก ๋์์จ ๊ฐ ์ค์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ตฌํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 1719_ํ๋ฐฐ (0) | 2024.01.10 |
---|---|
[Baekjoon] 11779_์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2 (0) | 2024.01.09 |
[Baekjoon] 1895_ํํฐ (1) | 2024.01.05 |
[Baekjoon] 2890_์นด์ฝ (1) | 2024.01.04 |
[Baekjoon] 9237_์ด์ฅ๋ ์ด๋ (1) | 2024.01.03 |