gimmickbutreal

[백준/자바] 특정 거리의 도시 찾기 - Java 18352 본문

Algorithm/Java

[백준/자바] 특정 거리의 도시 찾기 - Java 18352

isshosng 2023. 3. 9. 17:51
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package graph;
 
import java.util.*;
public class 특정거리의도시찾기 {
 
    static int n,m,k,x;
    static int visited[];
    static ArrayList<Integer>[] graph;
    static List<Integer> ans;
 
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
 
        n = sc.nextInt(); // 노드 수
        m = sc.nextInt(); // 간선 수
        k = sc.nextInt(); // 목표 거리
        x = sc.nextInt(); // 시작점
        graph = new ArrayList[n+1]; // 그래프 데이터 저장
        ans = new ArrayList<>(); // 정답
 
        for (int i=1; i<=n; i++){
            graph[i] = new ArrayList<Integer>(); // 그래프 리스트의 ArrayList 초기화
            // 노드 개수만큼 ArrayList 생성
        }
 
        for (int i=1; i<=m; i++){
            int s = sc.nextInt();
            int e = sc.nextInt();
            graph[s].add(e);
            System.out.println();
            System.out.println("그래프 데이터 저장 : " + graph[s]);
        }
 
        visited = new int[n+1]; // 방문 배열 초기화
 
        for(int i=0; i<=n; i++){
            visited[i] = -1;
            // 방문 배열을 만듦
        }
        bfs(x); // 시작점부터 bfs 시작
 
        for (int i=0; i<=n; i++){
            if(visited[i]==k){
                ans.add(i);
            }
            System.out.println("ans : " + ans);
        }
 
        if (ans.isEmpty()) {
            System.out.println("-1"); //
        } else{
            Collections.sort(ans); // 정답을 오름차순으로 출력
            for (int temp : ans){
                System.out.println(temp);
            }
        }
    }
 
    private static void bfs(int node){
        Queue<Integer> queue = new LinkedList<>();
        queue.add(node);
        visited[node]++// visited 배열에 현재 노드 방문 기록하기
        while (!queue.isEmpty()) {
            int now_node = queue.poll();
 
            for (int destination : graph[now_node]){
                System.out.println("now_node : " + now_node);
 
                // 큐에 데이터 삽입하고 visited 배열에 방문 거리 기록
                if (visited[destination]==-1){ 
                    visited[destination] = visited[now_node] + 1;
                    queue.add(destination);
                }
 
                System.out.println("visited[" +destination +"] : " + visited[destination]);
                System.out.println("queue : " + queue);
                System.out.println("-------------------------------");
            }
        }
    }
}
 
cs

 

https://www.acmicpc.net/problem/18352

 

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