백준 18352 - 특정 거리의 도시 찾기
Updated:
Java
18352 번 - 특정 거리의 도시 찾기
문제
접근 방법
한 지점에서 모든 지점까지 최단거리를 찾는다는 문제로, 데이크스트라를 떠올렸다. 하지만 데이크스트라의 시간복잡도 O(V * E)으로 이 문제에는 시간초과가 발생한다.
- V : 정점의 개수
- E : 간선의 개수
코드
import java.util.*;
import java.io.*;
// file input 주석 필수!!
public class Main {
// x : 출발도시
// k : 거리 정보
static int n,m,k,x;
static List<List<Integer>> list;
static boolean[] vis;
static int[] node;
public static void main(String args[]) throws IOException {
System.setIn(new FileInputStream("C:/Users/taxol/Desktop/DEV/Algo/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
k = stoi(stk.nextToken());
x = stoi(stk.nextToken());
list = new ArrayList<>();
for(int i = 0; i <= n; i++) {
list.add(new ArrayList<>());
}
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
list.get(stoi(stk.nextToken())).add(stoi(stk.nextToken()));
}
// BFS init
vis = new boolean[n + 1];
node = new int[n + 1];
BFS(x);
List<Integer> ans = new ArrayList();
for(int i = 1; i <= n; i++) {
if(node[i] == k) {
ans.add(i);
}
}
Collections.sort(ans);
for(int i : ans) {
System.out.println(i);
}
if(ans.isEmpty()) {
System.out.println(-1);
}
}
static void BFS(int st) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {st, 0});
vis[st] = true;
int curN, cost;
int[] q;
while(!queue.isEmpty()) {
q = queue.poll();
curN = q[0];
cost = q[1];
if(cost == k)
continue;
for(int next : list.get(curN)) {
if(!vis[next]) {
vis[next] = true;
node[next] = cost + 1;
queue.add(new int[] {next, cost + 1});
}
}
}
}
public static int stoi(String str){
return Integer.parseInt(str);
}
}