• 문제 링크
18352번: 특정 거리의 도시 찾기
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개
www.acmicpc.net
• 풀이 과정
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n, m, k, x;
static boolean[] visit;
static List<Integer>[] list;
static PriorityQueue<Integer> result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
visit = new boolean[n + 1];
list = new ArrayList[n + 1];
for (int i = 1; i <= n; i++)
list[i] = new ArrayList<>();
while (m-- > 0) {
st = new StringTokenizer(br.readLine());
int src = Integer.parseInt(st.nextToken());
int dest = Integer.parseInt(st.nextToken());
list[src].add(dest);
}
bfs();
if (!result.isEmpty()) {
while (!result.isEmpty())
bw.write(result.poll() + "\n");
} else
bw.write("-1");
bw.flush();
}
private static void bfs() {
PriorityQueue<Pair> pq = new PriorityQueue<>();
result = new PriorityQueue<>();
pq.offer(new Pair(x, 0));
visit[x] = true;
while (!pq.isEmpty()) {
Pair cur = pq.poll();
int src = cur.node;
int weight = cur.weight;
if (weight == k) {
result.offer(src);
continue;
}
for (int dest : list[src]) {
if (!visit[dest]) {
visit[dest] = true;
pq.offer(new Pair(dest, weight + 1));
}
}
}
}
private static class Pair implements Comparable<Pair> {
int node, weight;
public Pair(int node, int weight) {
this.node = node;
this.weight = weight;
}
@Override
public int compareTo(Pair o) {
return weight - o.weight;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1388 바닥 장식 - Graph Theory / Java (0) | 2023.01.22 |
---|---|
[백준] 1058 친구 - Graph Theory / Java (0) | 2023.01.21 |
[백준] 10211 Maximum Subarray - Dynamic Programming / Java (0) | 2023.01.19 |
[백준] 1535 안녕 - Dynamic Programming / Java (0) | 2023.01.18 |
[백준] 16395 파스칼의 삼각형 - Dynamic Programming / Java (0) | 2023.01.17 |
댓글