๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/18352
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฌธ์ ์ ์กฐ๊ฑด์์ ์ต๋ 300,000๊ฐ์ ๋์๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ ์๋ค๊ณ ๋ช ์ํ๊ธฐ ๋๋ฌธ์, ์ธ์ ํ๋ ฌ ๋ฐฉ์์ด ์๋ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด์ผํ๋ค.
์์ ๋์๋ถํฐ ๋๋ฌํ ์ ์๋ ๋ชจ๋ ๋์์ ๋ํด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ “๋ค์ต์คํธ๋ผ"๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฌผ๋ก , ํด๋น ๋ฌธ์ ์์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์ง๋ง, ๊ฐ ๋์๊ฐ ๊ฑฐ๋ฆฌ๊ฐ 1๋ก ๊ณ ์ ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ BFS๋ฅผ ์ด์ฉํด์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ์ถ๋ฐ ๋์๋ฅผ ์์์ผ๋ก BFS๋ฅผ ๊ตฌํํ๋ค.
- ์ฐ๊ฒฐ๋ ๋์ ์ค ๋ฐฉ๋ฌธํ์ง ์๊ณ , ํ์ฌ ๋์์์ ๊ฑฐ๋ฆฌ์ +1 ํ ๊ฐ๋ณด๋ค ์ฐ๊ฒฐ๋ ๋์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค๋ฉด ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ๊ฐฑ์ ํ๋ค.
- ์์ ๋์๋ก ๋ถํฐ ๋๋ฌํ ์ ์๋ ๋์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ตฌํ ๋ค K๋ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ๋์๋ฅผ ๋ฆฌ์คํธ์ ๋ด๋๋ค.
- ๋ฆฌ์คํธ ์ฌ์ด์ฆ๊ฐ 0์ด๋ผ๋ฉด, K ๊ฑฐ๋ฆฌ๋ก ๋๋ฌํ ์ ์๋ ๋์๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฏ๋ก -1์ ๋ฆฌํดํ๋ค.
- ๊ทธ ์ธ์ ๊ฒฝ์ฐ ๋ฆฌ์คํธ๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํ๋ค ๋ฆฌํดํ๋ค.
์ถ๋ ฅ ์กฐ๊ฑด์ผ๋ก BufferedWriter๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ 50%์์ ์ถ๋ ฅ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๐ฉ Java ์ฝ๋
package com.algorithm.Baekjoon;
import java.io.*;
import java.util.*;
public class Main_18352_ํน์ _๊ฑฐ๋ฆฌ์_๋์_์ฐพ๊ธฐ {
private static List<List<Integer>> graph;
private static final int INF = (int) 1e9;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // ๋์ (vertex)
int M = Integer.parseInt(st.nextToken()); // ๋๋ก (edge)
int K = Integer.parseInt(st.nextToken()); // ๋๋ฌ ๊ฑฐ๋ฆฌ
int X = Integer.parseInt(st.nextToken()); // ์์ ๋์
// ๊ทธ๋ํ ์ด๊ธฐํ
graph = new ArrayList<>();
for (int vertex = 0; vertex <= N; vertex++) {
graph.add(new ArrayList<>());
}
// ๋๋ก ์ฐ๊ฒฐ
for (int edge = 0; edge < M; edge++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
graph.get(start).add(end);
}
int[] rst = getMinDistanceCity(N, K, X);
// BufferedWriter ์์ฐ๋ฉด ์ถ๋ ฅ ์ด๊ณผ ์๋ฌ
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int city : rst) {
bw.write(String.valueOf(city));
bw.newLine();
}
bw.flush();
br.close();
}
private static int[] getMinDistanceCity(int n, int k, int x) {
Queue<Integer> pq = new LinkedList<>();
boolean[] visited = new boolean[n + 1];
int[] distance = new int[n + 1];
Arrays.fill(distance, INF);
pq.add(x);
distance[x] = 0; // ์์๋์ ๊ฑฐ๋ฆฌ 0
visited[x] = true; // ์์๋์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
while (!pq.isEmpty()) {
int city = pq.poll();
for (int next : graph.get(city)) {
// ๊ฑฐ๋ฆฌ ๋น๊ตํด์ ์ต๋จ ๊ฑฐ๋ฆฌ์ธ ๊ฒฝ์ฐ ๊ฐฑ์
if (!visited[next] && distance[next] > distance[city] + 1) {
visited[next] = true;
distance[next] = distance[city] + 1;
pq.add(next);
}
}
}
// X ๋์์์ ๋๋ฌํ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์ค K์ธ ๋์ ๊ตฌํ๊ธฐ
List<Integer> rst = new ArrayList<>();
for (int city = 1; city <= n; city++) {
if (distance[city] == k) rst.add(city);
}
// K์ธ ๋์ ์์ผ๋ฉด return 0
if (rst.size() < 1) return new int[]{-1};
// ๋์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฆฌํด
Collections.sort(rst);
return rst.stream().mapToInt(Integer::intValue).toArray();
}
}
๋ฐ์ํ
'Algorithm > ๊ทธ๋ํ(Graph)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค, Java] 2623๋ฒ : ์์ ํ๋ก๊ทธ๋จ (0) | 2022.08.09 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค, Java] ํฉ์น ํ์ ์๊ธ (0) | 2022.08.09 |
[๋ฐฑ์ค, Java] 1414๋ฒ : ๋ถ์ฐ์ด์๋๊ธฐ (0) | 2022.06.08 |
[๋ฐฑ์ค, Java] 1707๋ฒ : ์ด๋ถ ๊ทธ๋ํ (0) | 2022.04.27 |