๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1916)
< ์ต์๋น์ฉ ๊ตฌํ๊ธฐ >
๋ฌธ์ ํ์ด
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํด์ ์ต์ ๋น์ฉ์ ์ฐพ๋๋ค.
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 _1916_ { // ์ต์๋น์ฉ ๊ตฌํ๊ธฐ
static ArrayList<ArrayList<City>> list;
static boolean visited[];
static int result[];
static class City {
private int num;
private int money;
public City(int num, int money) {
this.num = num;
this.money = money;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(bf.readLine());
int m = Integer.parseInt(bf.readLine());
list = new ArrayList<>();
visited = new boolean[n + 1];
result = new int[n + 1];
for (int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
result[i] = Integer.MAX_VALUE;
}
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 money = Integer.parseInt(st.nextToken());
list.get(start).add(new City(end, money));
}
st = new StringTokenizer(bf.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
bfs(start, end);
System.out.println(result[end]);
}
private static void bfs(int start, int end) {
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
queue.add(new int[] { start, 0 });
visited[start] = true;
while (!queue.isEmpty()) {
int temp[] = queue.poll();
if (result[temp[0]] < temp[1])
continue;
for (int i = 0; i < list.get(temp[0]).size(); i++) {
City city = list.get(temp[0]).get(i);
if (!visited[city.num] || result[city.num] > temp[1] + city.money) {
visited[city.num] = true;
result[city.num] = temp[1] + city.money;
queue.add(new int[] { city.num, result[city.num] });
}
}
}
}
}
Main
๋ณ์)
City : ๋์ ๋ฒํธ, ๋น์ฉ
n : ๋์ ๊ฐ์
m : ๋ฒ์ค ๊ฐ์
list : ๋์ ์ฐ๊ฒฐ๋ ๋ฒ์ค
visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
result : ์ต์ ๋น์ฉ
start, end, money : ์์ ๋์, ๋์ฐฉ ๋์, ๋น์ฉ
queue : ์ฐ์ ์์ ํ <๋์ ๋ฒํธ, ๋น์ฉ>
๋์ ๊ฐ์(n), ๋ฒ์ค ๊ฐ์(m)๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. ๋ฒ์ค ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ํ list์ ๋์ ๋ฒํธ์ ๋น์ฉ์ ์ ์ฅํด ๋๋ค. ์ถ๋ฐ์ ์ ๋ฒํธ์ ๋์ฐฉ์ ์ ๋์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ ํ bfs ํจ์๋ฅผ ํธ์ถํ๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํด์ ์ถ๋ฐ ๋์ ๋ฒํธ์ ๋น์ฉ์ ์ ์ฅํ๋ฉฐ ๋ฐฉ๋ฌธ ํ์ํ๋ค. queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ฉฐ ํ์ฌ ๋น์ฉ์ด ํ์ฌ ๋์๊น์ง์ ๋น์ฉ๋ณด๋ค ํฌ๋ค๋ฉด ๊ณ์ฐํ ํ์ ์์ผ๋ฏ๋ก ๋์ด๊ฐ๋ค. ํ์ฌ ๋น์ฉ์ด ํ์ฌ ๋์ ๋น์ฉ๊ณผ ๊ฐ๊ฑฐ๋ ์๋ค๋ฉด ๋์์ ์ฐ๊ฒฐ๋ ๋ฒ์ค๋ฅผ ์ํํ๋ค. ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ฑฐ๋ ์ต์ ๋น์ฉ์ด๋ผ๋ฉด ๊ฐ์ ์ ๋ฐ์ดํธํด ์ค ํ queue์ ์ถ๊ฐํด ์ค๋ค.
์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.

'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 3135_๋ผ๋์ค (1) | 2023.11.15 |
---|---|
[Baekjoon] 5671_ํธํ ๋ฐฉ ๋ฒํธ (0) | 2023.11.14 |
[Baekjoon] 1141_์ ๋์ฌ (1) | 2023.11.09 |
[Baekjoon] 1713_ํ๋ณด ์ถ์ฒํ๊ธฐ (0) | 2023.11.08 |
[Baekjoon] 9659_๋ ๊ฒ์ 5 (0) | 2023.11.07 |