DFS와 BFS

Updated:

동작 방식은 저의 예전 블로그의 글을 참고해보시면 좋을거같습니다!!
https://blog.naver.com/gktgnjftm/221458488876
(공을 좀 많이 들여놔서 좀 아깝더라고요 ㅎㅎ)
(단 Java는 없고 , C++로만 설명이 되어있습니다!!)
아래는 C++와 Java로 이루어져 있습니다!

by C++(DFS)

void dfs(int here,vector<vector<int>>&graph, int *visited,vector<int>& temp){
    visited[here] = 1;
    printf("%d ",here);
    for(int i=0 ; i<graph[here].size();i++) {
        int next = graph[here][i];
        if(!visited[next]) {
            dfs(next,graph,visited,temp);
        }
    }
}

by Java(DFS)

bw의 경우는 BufferedWriter를 사용했다

private static void dfs(int here, ArrayList<Integer>[] graph, boolean[] visited) throws IOException {
        visited[here] = true;
        bw.write(String.valueOf(here)+" ");
        bw.flush();
        for(int i=0;i<graph[here].size();i++) {
            int next = graph[here].get(i);
            if(!visited[next]) dfs(next,graph,visited);
        }
    }

by C++(BFS)

vector 자료구조와, queue 자료구조를 사용

void bfs(int here,vector<vector<int>> &graph, int *visited,vector<int> &temp){
    queue<int> q;
    q.push(here);
    visited[here] = 1;
    while(!q.empty()) {
        int here = q.front();
        printf("%d ",here);
        q.pop();
        for(int i=0; i<graph[here].size(); i++){
            int next = graph[here][i];
            if(!visited[next]){
                visited[next] = 1;
                q.push(next);
            }
        }
    }
}

by Java(BFS)

성능의 향상을 위해(출력시 속도 향상) BufferedWriter 사용, ArrayDeque 클래스(Queue 관련) 사용 그리고 ArrayList 클래스 사용, 그러나 ListDeque 인터페이스를 사용하자, 이유는 더 일반적으로 데이터를 보내거나 받기 위함임

private static void bfs(int here,ArrayList<Integer>[] graph,boolean[] visited) throws IOException {
        ArrayDeque<Integer> q = new ArrayDeque<>();
        q.add(here);
        visited[here] = true;
        while(!q.isEmpty()) {
            int Here = q.peekFirst();
            bw.write(String.valueOf(Here)+" ");
            bw.flush();
            q.pop();
            for(int i=0;i<graph[Here].size();i++){
                int next = graph[Here].get(i);
                if(!visited[next]) {
                    visited[next] = true;
                    q.add(next);
                }
            }
        }
     }

자바의 전체 코드
문제 : DFS와 BFS

import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);
        int st = Integer.parseInt(input[2]);
        ArrayList<Integer>[] graph = new ArrayList[n+1];
        boolean visited[] = new boolean[n+1];
        for(int i=1;i<=n;i++) {
            graph[i] = new ArrayList<>();
        }
        for(int i=0;i<m;i++) {
            String[] s = br.readLine().split(" ");
            int here = Integer.parseInt(s[0]);
            int next = Integer.parseInt(s[1]);
            graph[here].add(next);
            graph[next].add(here);
        }
        for(int i=1;i<=n;i++) {
            Collections.sort(graph[i]);
        }
        dfs(st,graph,visited);
        System.out.println();
        visited = new boolean[n+1];
        bfs(st,graph,visited);
        bw.close();
    }
    private static void dfs(int here, ArrayList<Integer>[] graph, boolean[] visited) throws IOException {
        visited[here] = true;
        bw.write(String.valueOf(here)+" ");
        bw.flush();
        for(int i=0;i<graph[here].size();i++) {
            int next = graph[here].get(i);
            if(!visited[next]) dfs(next,graph,visited);
        }
    }
    private static void bfs(int here,ArrayList<Integer>[] graph,boolean[] visited) throws IOException {
        ArrayDeque<Integer> q = new ArrayDeque<>();
        q.add(here);
        visited[here] = true;
        while(!q.isEmpty()) {
            int Here = q.peekFirst();
            bw.write(String.valueOf(Here)+" ");
            bw.flush();
            q.pop();
            for(int i=0;i<graph[Here].size();i++){
                int next = graph[Here].get(i);
                if(!visited[next]) {
                    visited[next] = true;
                    q.add(next);
                }
            }
        }
     }
}

궁금하신 사항은 댓글을 남겨주시면 감사하겠습니다^^
잘못 된점 이 있다면 댓글 남겨주시면 감사드리겠습니다

Leave a comment