์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- ํ์ด์ฝ ์น๊ตฌ์ฝ๋
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์ฐ์ต๋ฌธ์
- ํ๋ฌํฐ ๊ฐ๋ฐํ๊ฒฝ ์ค์
- programmers
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ 3ํ
- C
- spring
- ํ์ด์ฝ ์ถ์ฒ์ธ์ฝ๋
- ํ๋ฌํฐ
- C์ธ์ด
- ํ์ด์ฌ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์์
- ํ์ด์ฝ ์ถ์ฒ์ธ
- Java
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์๋ฃจ์
- ๋ฐฑ์ค
- php ํ๋ก๊ทธ๋๋ฐ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ๋ฌธ์ ํ์ด
- ํ์ ๋ถ๊ธฐ
- ์๋ฐ
- JAVA SPRING
- ์คํ๋ง
- php
- ์๋ฐ ์คํ๋ง
- SWEA
- ํ์ด์ฝ ์ด๋์ฝ๋
- Flutter
- ๋ฐฐ์ด
- ์ต๋จ ๊ฒฝ๋ก
- Today
- Total
ImJay
[BOJ/Java] 9370. ๋ฏธํ์ธ ๋์ฐฉ์ง ๋ณธ๋ฌธ
๐ [BOJ/Java] 9370. ๋ฏธํ์ธ ๋์ฐฉ์ง
๐ก ๋ฌธ์ ํด์
์ด๋ค ๋์์์ ์ถ๋ฐํ์ฌ ๋ชฉ์ ์ง ํ๋ณด๋ค ์ค ํน์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ๊ฑฐ์ณ ๋์ฐฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์์ผ ํ๋ค.
์ฆ, ์ถ๋ฐ์ง์์ ํน์ ๋๋ก๋ฅผ ์ง๋ ๋ชฉ์ ์ง์ ๋๋ฌํ ์ ์๋์ง๋ฅผ ํ์ธํ๋ ๋ฌธ์ ์ด๋ค.
๐ ์ฃผ์ด์ง ์ ๋ณด:
- n: ๊ต์ฐจ๋ก(๋ ธ๋) ๊ฐ์
- m: ๋๋ก(๊ฐ์ ) ๊ฐ์
- t: ๋ชฉ์ ์ง ํ๋ณด ๊ฐ์
- s: ์ถ๋ฐ์ง
- g, h: ๋ฐ๋์ ์ง๋์ผ ํ๋ ๋๋ก์ ๋ ์ ์
- m๊ฐ์ ๊ฐ์ ์ ๋ณด (์๋ฐฉํฅ, ๊ฐ์ค์น ํฌํจ)
- t๊ฐ์ ๋ชฉ์ ์ง ํ๋ณด
๐ ๋ชฉํ:
- s → ๋ชฉ์ ์ง๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก ์ค g-h ๋๋ก๋ฅผ ๋ฐ๋์ ์ง๋์ผ ํ๋ ๊ฒฝ์ฐ ์ฐพ๊ธฐ
- ๊ฐ๋ฅํ ๋ชฉ์ ์ง๋ค์ ์ค๋ฆ์ฐจ์ ์ถ๋ ฅ
์์ ์ ๋ ฅ:
2
6 9 2
2 3 6
1 2 1
1 3 2
2 4 4
2 5 3
3 6 5
4 6 2
5 6 3
4
6
์์ ์์ ์์ 2 → 6์ผ๋ก ๊ฐ ๋ 3-6์ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ ๋ชฉ์ ์ง๋ฅผ ์ฐพ๋๋ค.
๐ ํ์ด ๊ณผ์
1๏ธโฃ ๋ค์ต์คํธ๋ผ (Dijkstra) ์๊ณ ๋ฆฌ์ฆ ํ์ฉ
๐น ์ถ๋ฐ์ ์์ ๊ฐ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค.
๐น g-h ๋๋ก๋ฅผ ์ง๋๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ๊ณ ๋ คํด์ผ ํ๋ค.
2๏ธโฃ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ (3๋ฒ์ ๋ค์ต์คํธ๋ผ ์คํ)
โ
s์์ ๋ชจ๋ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
โ
g์์ ๋ชจ๋ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
โ
h์์ ๋ชจ๋ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
3๏ธโฃ ๋ชฉ์ ์ง ํ๋ณด ํ๋ณ
๐ก s → ๋ชฉ์ ์ง์ ์ต๋จ ๊ฒฝ๋ก๊ฐ s → g → h → ๋ชฉ์ ์ง ๋๋ s → h → g → ๋ชฉ์ ์ง ๊ฒฝ๋ก์ ์ผ์นํ๋์ง ํ์ธ
๐ป ์ฝ๋ (Java)
import java.util.*;
public class Main {
static final int INF = 200000000;
static int n, m, t, s, g, h;
static List<Node>[] graph;
static int[] targets;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt(); // ํ
์คํธ ์ผ์ด์ค ๊ฐ์
while (T-- > 0) {
n = sc.nextInt();
m = sc.nextInt();
t = sc.nextInt();
s = sc.nextInt();
g = sc.nextInt();
h = sc.nextInt();
graph = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
graph[i] = new ArrayList<>();
}
int ghDist = 0; // g-h ๊ฐ์ ์ ๊ฑฐ๋ฆฌ ์ ์ฅ
for (int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int d = sc.nextInt();
graph[a].add(new Node(b, d));
graph[b].add(new Node(a, d));
if ((a == g && b == h) || (a == h && b == g)) {
ghDist = d;
}
}
targets = new int[t];
for (int i = 0; i < t; i++) {
targets[i] = sc.nextInt();
}
// 3๋ฒ์ ๋ค์ต์คํธ๋ผ ์คํ
int[] distFromS = dijkstra(s);
int[] distFromG = dijkstra(g);
int[] distFromH = dijkstra(h);
List<Integer> result = new ArrayList<>();
for (int target : targets) {
int directDist = distFromS[target];
int viaG = distFromS[g] + ghDist + distFromH[target];
int viaH = distFromS[h] + ghDist + distFromG[target];
if (directDist == viaG || directDist == viaH) {
result.add(target);
}
}
Collections.sort(result);
for (int x : result) {
System.out.print(x + " ");
}
System.out.println();
}
}
static int[] dijkstra(int start) {
PriorityQueue<Node> pq = new PriorityQueue<>();
int[] dist = new int[n + 1];
Arrays.fill(dist, INF);
dist[start] = 0;
pq.offer(new Node(start, 0));
while (!pq.isEmpty()) {
Node cur = pq.poll();
int now = cur.index, cost = cur.distance;
if (dist[now] < cost) continue;
for (Node next : graph[now]) {
int newCost = cost + next.distance;
if (newCost < dist[next.index]) {
dist[next.index] = newCost;
pq.offer(new Node(next.index, newCost));
}
}
}
return dist;
}
static class Node implements Comparable<Node> {
int index, distance;
public Node(int index, int distance) {
this.index = index;
this.distance = distance;
}
public int compareTo(Node o) {
return Integer.compare(this.distance, o.distance);
}
}
}
โฑ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ: O((V + E) log V)
- 3๋ฒ์ ๋ค์ต์คํธ๋ผ ์คํ: O(3 * (V + E) log V)
- n ≤ 2000, m ≤ 50,000์ด๋ฏ๋ก ์ถฉ๋ถํ ๊ฐ๋ฅ
๐ง ๋๋ ์
๐ ๋ค์ต์คํธ๋ผ๋ฅผ ํ์ฉํ๋ ์์ฉ ๋ฌธ์ ์๋ค.
โก๏ธ ๊ธฐ๋ณธ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ 3๋ฒ ์คํํด์ผ ํ๋ ๊ฒ์ด ํต์ฌ์ด์๋ค.
โก๏ธ ํน์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ์ง๋์ผ ํ๋ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ตํ ์ ์์๋ค.
๐ ๋ํ
์ผํ ๋ถ๋ถ์์ ์ค์ํ๊ธฐ ์ฌ์ ๋ค.
โ
g-h ๊ฐ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํ ์ ์ฅํด์ผ ํ๋ค.
โ
๋ค์ต์คํธ๋ผ ์คํ ํ, ํ๋ณด ๋ชฉ์ ์ง๋ฅผ ํ๋ณํ๋ ๋ก์ง์ด ์ค์ํ๋ค.
โ
์ต์ข
์ ์ผ๋ก ์ค๋ฆ์ฐจ์ ์ถ๋ ฅ์ ์์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค.
๐ ์ ์ฒด์ ์ผ๋ก ๊ทธ๋ํ ํ์์ ๋ํ ๊ฐ๋ ์ ํํํ๊ฒ ๋ค์ง ์ ์๋ ๋ฌธ์ ์๋ค! ๐
'์๊ณ ๋ฆฌ์ฆ > BOJ - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/Java] 11657. ํ์๋จธ์ (0) | 2025.03.10 |
---|---|
[BOJ/Java] 1981. ๋ฐฐ์ด์์ ์ด๋ (1) | 2025.03.10 |
[BOJ/Java] 1039. ๊ตํ (0) | 2025.03.10 |
[BOJ/Java] 10942. ํฐ๋ฆฐ๋๋กฌ? (0) | 2025.03.10 |
[BOJ/Java] 7579. ์ฑ (0) | 2025.03.10 |