๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1238
1238๋ฒ: ํํฐ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ ๋ ฅ๋๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง i๋ฒ์งธ ๋๋ก์ ์์์ , ๋์ , ๊ทธ๋ฆฌ๊ณ ์ด ๋๋ก๋ฅผ ์ง๋๋๋ฐ ํ์ํ ์์์๊ฐ Ti๊ฐ ๋ค์ด
www.acmicpc.net
โธ ๋ฌธ์
N๊ฐ์ ์ซ์๋ก ๊ตฌ๋ถ๋ ๊ฐ๊ฐ์ ๋ง์์ ํ ๋ช ์ ํ์์ด ์ด๊ณ ์๋ค.
์ด๋ ๋ ์ด N๋ช ์ ํ์์ด X (1 ≤ X ≤ N)๋ฒ ๋ง์์ ๋ชจ์ฌ์ ํํฐ๋ฅผ ๋ฒ์ด๊ธฐ๋ก ํ๋ค. ์ด ๋ง์ ์ฌ์ด์๋ ์ด M๊ฐ์ ๋จ๋ฐฉํฅ ๋๋ก๋ค์ด ์๊ณ i๋ฒ์งธ ๊ธธ์ ์ง๋๋๋ฐ Ti(1 ≤ Ti ≤ 100)์ ์๊ฐ์ ์๋นํ๋ค.
๊ฐ๊ฐ์ ํ์๋ค์ ํํฐ์ ์ฐธ์ํ๊ธฐ ์ํด ๊ฑธ์ด๊ฐ์ ๋ค์ ๊ทธ๋ค์ ๋ง์๋ก ๋์์์ผ ํ๋ค. ํ์ง๋ง ์ด ํ์๋ค์ ์๋ ๊ฒ์๋ฌ์ ์ต๋จ ์๊ฐ์ ์ค๊ณ ๊ฐ๊ธฐ๋ฅผ ์ํ๋ค.
์ด ๋๋ก๋ค์ ๋จ๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ ์๋ง ๊ทธ๋ค์ด ์ค๊ณ ๊ฐ๋ ๊ธธ์ด ๋ค๋ฅผ์ง๋ ๋ชจ๋ฅธ๋ค. N๋ช ์ ํ์๋ค ์ค ์ค๊ณ ๊ฐ๋๋ฐ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ์๋นํ๋ ํ์์ ๋๊ตฌ์ผ์ง ๊ตฌํ์ฌ๋ผ.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ ๋ ฅ๋๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง i๋ฒ์งธ ๋๋ก์ ์์์ , ๋์ , ๊ทธ๋ฆฌ๊ณ ์ด ๋๋ก๋ฅผ ์ง๋๋๋ฐ ํ์ํ ์์์๊ฐ Ti๊ฐ ๋ค์ด์จ๋ค. ์์์ ๊ณผ ๋์ ์ด ๊ฐ์ ๋๋ก๋ ์์ผ๋ฉฐ, ์์์ ๊ณผ ํ ๋์ A์์ ๋ค๋ฅธ ๋์ B๋ก ๊ฐ๋ ๋๋ก์ ๊ฐ์๋ ์ต๋ 1๊ฐ์ด๋ค.
๋ชจ๋ ํ์๋ค์ ์ง์์ X์ ๊ฐ์ ์๊ณ , X์์ ์ง์ผ๋ก ๋์์ฌ ์ ์๋ ๋ฐ์ดํฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ N๋ช ์ ํ์๋ค ์ค ์ค๊ณ ๊ฐ๋๋ฐ ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ํ์์ ์์์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ๋ฐ์ดํฌ์คํธ๋ผ, ์ต๋จ ๊ฒฝ๋ก
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
- ๋ชฉ์ ์ง ๋ ธ๋์ธ x๋ฒ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก one-to-all ์ต๋จ ๊ฑฐ๋ฆฌ ๋น์ฉ์ ๊ตฌํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋์ด ์๊ฐํด ๋ณผ ์ ์๋๋ฐ
- ํํฐ์ ์ฐธ์ํ๋ ๊ฒฝ์ฐ - ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ค์ ๋ํด x๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ
- ํํฐ๊ฐ ๋๋๊ณ ์ง์ผ๋ก ๋์์ค๋ ๊ฒฝ์ฐ - x๋ฒ ๋ ธ๋์ ๋ํด ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ค๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ
- ์ฐ๋ฆฌ๊ฐ ์๊ฐํด ๋ณด์์ผ ํ ๊ฒฝ์ฐ๋ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์ธ๋ฐ,
- ์๋ฅผ ๋ค์ด 2๋ฒ ๋ ธ๋๋ฅผ ๋ชฉ์ ์ง ๋ ธ๋๋ก ์๊ฐํ๋ฉด 1, 3, 4๋ฒ ๋ ธ๋ ๊ฐ๊ฐ์ ๋ค์ต์คํธ๋ผ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ๋นํจ์จ์ ์ด๋ค.
- ์ด๋ฐ ๋นํจ์จ์ ๋ฐฉ๋ฒ ๋์ , ๋จ๋ฐฉํฅ ๊ฐ์ ์ ๋ฐ๋๋ก ์ ์ฅํ๊ฒ ๋๋ฉด 2๋ฒ ๋ ธ๋๋ฅผ ๋ชฉ์ ์ง ๋ ธ๋๊ฐ ์๋ ์ถ๋ฐ์ง ๋ ธ๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 16644KB
์๊ฐ : 152ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n, m, x;
// ๋ชจ๋ ๋
ธ๋์์ x๋ฒ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ํด ๋จ๋ฐฉํฅ์ ๋ฐ๋๋ก ์ ์ฅ ํ ๋ฆฌ์คํธ
static ArrayList<ArrayList<Pos>> reverseList;
static ArrayList<ArrayList<Pos>> list;
static int[] reverseDist;
static int[] dist;
static boolean[] checked;
static PriorityQueue<Pos> pq;
static public class Pos implements Comparable<Pos> {
int end; int dist;
public Pos(int end, int dist) {
this.end = end; this.dist = dist;
}
@Override
public int compareTo(Pos o) {
return this.dist - o.dist;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken()); // ๋ชฉ์ ์ง
reverseList = new ArrayList<>();
list = new ArrayList<>();
for (int i = 0; i <= n; i++) {
reverseList.add(new ArrayList<>());
list.add(new ArrayList<>());
}
int u, v, w;
while (m --> 0) {
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
// ๋ชฉ์ ์ง๋ฅผ ์ถ๋ฐ์ง๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ์
๋ ฅ ๋ฐ๋๋ก ์ ์ฅ
reverseList.get(v).add(new Pos(u, w));
// ์ง์ผ๋ก ๋๋์ ์ค๊ธฐ - ์
๋ ฅ ๊ทธ๋๋ก ์ ์ฅ
list.get(u).add(new Pos(v, w));
}
reverseDist = new int[n+1];
Arrays.fill(reverseDist, Integer.MAX_VALUE);
Dijkstra(reverseList, reverseDist, x);
dist = new int[n+1];
Arrays.fill(dist, Integer.MAX_VALUE);
Dijkstra(list, dist, x);
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = Math.max(ans, reverseDist[i]+dist[i]);
}
System.out.println(ans);
}
private static void Dijkstra(ArrayList<ArrayList<Pos>> list, int[] dist, int start) {
checked = new boolean[n+1];
pq = new PriorityQueue<>();
pq.offer(new Pos(start, 0));
dist[start] = 0;
while (!pq.isEmpty()) {
int end = pq.poll().end;
if (checked[end]) continue;
checked[end] = true;
for (Pos next : list.get(end)) {
if (dist[next.end] > dist[end]+ next.dist) {
dist[next.end] = dist[end]+ next.dist;
pq.offer(new Pos(next.end, dist[next.end]));
}
}
}
}
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_20160] ์ผ์ฟ ๋ฅดํธ ์์ค๋ง ์ผ์ฟ ๋ฅดํธ ์ฃผ์ธ์ (0) | 2024.11.21 |
---|---|
[Boj_1464] ๋ค์ง๊ธฐ 3 (0) | 2024.07.19 |
[Boj_2252] ์ค ์ธ์ฐ๊ธฐ (1) | 2024.01.11 |
[Boj_21921] ๋ธ๋ก๊ทธ (1) | 2023.12.04 |
[Boj_2447] ๋ณ ์ฐ๊ธฐ - 10 (0) | 2023.11.28 |