백준 1260 DFS/BFS (Java)

김주현·2020년 1월 6일
0

풀이
인접행렬 또는 인접리스트를 활용해 풀 수 있는 문제인데
인접행렬 사용시 시간 복잡도 : O(V^2)
인접리스트 사용시 시간 복잡도 : O(V+E)
이므로 인접리스트를 사용하여 푸는 것이 좋다.
양방향 간선이기 때문에 ArrayList<ArrayList>를 사용해서 하나의 간선을 입력받을 시 반대 간선도 같이 저장 시켜주는 방식으로 구현.
ex) (1,2) 가 들어올 시 (2,1)도 함께 저장
DFS/BFS는 기초 방식대로 사용.

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class DFS_BFS {

    static ArrayList<ArrayList<Integer>> map = new ArrayList<>();
    static boolean[] visited;

    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());
        int M = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());

        for(int i = 0; i <= N; i++){
            map.add(new ArrayList<>());
        }

        visited = new boolean[N+1];

        for(int i = 1; i <= M; i++){
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            map.get(x).add(y);
            map.get(y).add(x);
        }

        dfs(V);
        visited = new boolean[N+1];
        System.out.println();
        bfs(V);
    }

    public static void dfs(int v){
        visited[v] = true;
        System.out.print(v + " ");
        for(int value : map.get(v)){
            if(!visited[value]){
                dfs(value);
            }
        }
    }

    public static void bfs(int v){
        Queue<Integer> q = new LinkedList<>();
        q.offer(v);
        visited[v] = true;

        while(!q.isEmpty()){
            int value = q.poll();
            System.out.print(value + " ");

            for(int e : map.get(value)){
                if(!visited[e]){
                    visited[e] = true;
                    q.offer(e);
                }
            }
        }
    }

    public static void printEdge(){
        for(int i = 0; i<map.size(); i++){
            for(int j = 0; j<map.get(i).size(); j++){
                System.out.print(map.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }

}
profile
Hello World

0개의 댓글