
https://www.acmicpc.net/problem/9370
๐ ์๋ฐ(Java)๋ก ํธ๋ ๋ฏธํ์ธ ๋์ฐฉ์ง ๋ฌธ์ - ๋ฐฑ์ค 9370 ๐๐
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 9370๋ฒ - ๋ฏธํ์ธ ๋์ฐฉ์ง ๋ฌธ์ ์ ๋๋ค.
์ถ๋ฐ์ง(S)์์ ๋ชฉ์ ์ง ํ๋ณด๋ค ์ค,
ํน์ ๋๋ก(G-H)๋ฅผ ๋ฐ๋์ ์ง๋๋ฉด์ ๋๋ฌํ ์ ์๋ ๋ชฉ์ ์ง๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ์ฌ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๐ก ์์ ์ ๋ ฅ
2
6 9 2
1 2 3
1 2 1
1 3 2
2 3 2
3 4 3
3 5 5
4 5 4
4 6 1
5 6 2
5
6
๐ก ์์ ์ถ๋ ฅ
6
5 6
โก ๋ชฉ์ ์ง ํ๋ณด ์ค ํน์ ๋๋ก(G-H)๋ฅผ ์ง๋๋ฉด์ ๋๋ฌํ ์ ์๋ ๊ณณ์ ์ถ๋ ฅ
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ(Dijkstra) ์ ํ์ฉํฉ๋๋ค.
โ๏ธ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ
โ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ 3๋ฒ ์คํ
โ ์ถ๋ฐ์ง(S)์์ ๋ชจ๋ ์ ์ ๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
โ G, H ์ ์ ์์ ๊ฐ๊ฐ ๋ค์ต์คํธ๋ผ ์คํํ์ฌ ๊ฒฝ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
โ ์ถ๋ฐ์ง โ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ์, ํน์ ๋๋ก(G-H)๋ฅผ ๊ฒฝ์ ํ ๋ ๊ฐ์ง ๊ฑฐ๋ฆฌ ๋น๊ต
โ ๋ ๊ฑฐ๋ฆฌ ๊ฐ์ด ๊ฐ๋ค๋ฉด ํด๋น ๋ชฉ์ ์ง๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒ
๐น Java ์ฝ๋ ํด์ค
import java.io.*;
import java.util.*;
public class b9370 {
static int T, N, M, D; // ๊ต์ฐจ๋ก ์, ๋๋ก ์, ๋ชฉ์ ์ง ํ๋ณด ์
static int S, G, H; // ์ถ๋ฐ์ง, G์ H ์ฌ์ด์ ๋๋ก๋ฅผ ์ง๋๊ฐ
static HashMap<Integer, ArrayList<Node>> graph;
static class Node implements Comparable<Node> {
int spot;
int distance;
public Node(int spot, int distance) {
this.spot = spot;
this.distance = distance;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.distance, o.distance);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = stringToInteger(br.readLine());
for (int t = 0; t < T; t++) {
StringTokenizer st = new StringTokenizer(br.readLine());
N = stringToInteger(st.nextToken());
M = stringToInteger(st.nextToken());
D = stringToInteger(st.nextToken());
st = new StringTokenizer(br.readLine());
S = stringToInteger(st.nextToken());
G = stringToInteger(st.nextToken());
H = stringToInteger(st.nextToken());
graph = new HashMap<>();
for (int i = 1; i <= N; i++) graph.put(i, new ArrayList<>());
int ghDistance = 0;
for (int m = 0; m < M; m++) {
st = new StringTokenizer(br.readLine());
int a = stringToInteger(st.nextToken());
int b = stringToInteger(st.nextToken());
int d = stringToInteger(st.nextToken());
graph.get(a).add(new Node(b, d));
graph.get(b).add(new Node(a, d));
if ((a == G && b == H) || (a == H && b == G)) ghDistance = d;
}
int[] distFromS = dijkstra(S);
int[] distFromG = dijkstra(G);
int[] distFromH = dijkstra(H);
List<Integer> results = new ArrayList<>();
for (int i = 0; i < D; i++) {
int target = stringToInteger(br.readLine());
int directDist = distFromS[target];
// G-H ๊ฐ์ ์ ๊ฒฝ์ ํ๋ ๋ ๊ฐ์ง ๊ฒฝ๋ก ๋น๊ต
int viaGH = distFromS[G] + ghDistance + distFromH[target];
int viaHG = distFromS[H] + ghDistance + distFromG[target];
if (directDist == viaGH || directDist == viaHG) {
results.add(target);
}
}
Collections.sort(results);
StringBuilder sb = new StringBuilder();
for (int res : results) sb.append(res).append(" ");
System.out.println(sb);
}
}
private static int[] dijkstra(int s) {
int[] dist = new int[N + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[s] = 0;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(s, 0));
while (!pq.isEmpty()) {
Node cur = pq.poll();
int curSpot = cur.spot;
int curDist = cur.distance;
if (dist[curSpot] < curDist) continue;
for (Node next : graph.get(curSpot)) {
int newDist = curDist + next.distance;
if (newDist < dist[next.spot]) {
dist[next.spot] = newDist;
pq.add(new Node(next.spot, newDist));
}
}
}
return dist;
}
private static int stringToInteger(String s) {
return Integer.parseInt(s);
}
}
๐ ์ฝ๋ ์ค๋ช
๐ 1. ๊ทธ๋ํ ์ ๋ ฅ ๋ฐ ์ด๊ธฐํ
graph = new HashMap<>();
for (int i = 1; i <= N; i++) graph.put(i, new ArrayList<>());
int ghDistance = 0;
for (int m = 0; m < M; m++) {
int a = stringToInteger(st.nextToken());
int b = stringToInteger(st.nextToken());
int d = stringToInteger(st.nextToken());
graph.get(a).add(new Node(b, d));
graph.get(b).add(new Node(a, d));
if ((a == G && b == H) || (a == H && b == G)) ghDistance = d;
}
โข ์ธ์ ๋ฆฌ์คํธ(graph)๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ์ ์ฅ
โข ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก ์์ชฝ(a-b & b-a) ์ถ๊ฐ
โข ํน์ ๋๋ก(G-H)์ ๊ฑฐ๋ฆฌ(ghDistance) ์ ์ฅ
๐ 2. ๋ค์ต์คํธ๋ผ ์คํ
int[] distFromS = dijkstra(S);
int[] distFromG = dijkstra(G);
int[] distFromH = dijkstra(H);
โข ์ถ๋ฐ์ง(S), G, H์์ ๊ฐ๊ฐ ๋ค์ต์คํธ๋ผ ์คํ
โข ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด(dist[])์ ์์ฑํ์ฌ ์ ์ฅ
๐ 3. ๋ชฉ์ ์ง ํ๋ณด ํํฐ๋ง
for (int i = 0; i < D; i++) {
int target = stringToInteger(br.readLine());
int directDist = distFromS[target];
int viaGH = distFromS[G] + ghDistance + distFromH[target];
int viaHG = distFromS[H] + ghDistance + distFromG[target];
if (directDist == viaGH || directDist == viaHG) {
results.add(target);
}
}
โข ์ถ๋ฐ์ง โ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ์ G-H๋ฅผ ์ง๋๊ฐ๋ ๊ฑฐ๋ฆฌ ๋น๊ต
โข ๊ฒฝ๋ก๊ฐ ๋์ผํ๋ฉด results ๋ฆฌ์คํธ์ ์ถ๊ฐ
๐ 4. ์ต์ข ๊ฒฐ๊ณผ ์ถ๋ ฅ
Collections.sort(results);
StringBuilder sb = new StringBuilder();
for (int res : results) sb.append(res).append(" ");
System.out.println(sb);
โข ๊ฒฐ๊ณผ๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ์ถ๋ ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
โ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ 3๋ฒ ์คํํ์ฌ ๊ฒฝ์ ๊ฒฝ๋ก ํ์ธ
โ ์ถ๋ฐ์ง โ ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ์ G-H ๊ฒฝ์ ๊ฒฝ๋ก ๋น๊ต
โ O((N + M) log N) ๋ณต์ก๋๋ก ์ต์ ํ๋ ๊ฒฝ๋ก ํ์
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ์ข์์์ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค! ๐
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b.11657 ํ์๋จธ์ (0) | 2025.03.20 |
---|---|
b1956. ์ด๋ (0) | 2025.03.20 |
b.1707 ์ด๋ถ ๊ทธ๋ํ (0) | 2025.03.12 |
b24445. ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 2 (1) | 2025.03.06 |
b24444. ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 1 (0) | 2025.03.04 |