본문 바로가기

Algorithm

DFS and BFS

반응형
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class GraphTest {
    static int n, m,v; //정점의 개수, 간선의 개수, 시작 정점을 나타내는 변수
    static int[][] graph; //인접 행렬을 나타내는 graph 배열
    static boolean[] visited; //정점의 방문 여부를 나타내는 visited 배열
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        v = sc.nextInt();
        System.out.println("n: " + n + " m: " + m + " v: " + v);
        graph = new int[n+1][n+1]; //정점의 개수가 n이므로 n+1로 초기화, 1부터 시작하므로
        visited = new boolean[n+1]; //정점의 개수가 n이므로 n+1로 초기화
        for (int i = 0; i < m; i++) { //간선의 개수 m만큼 반복
            int src = sc.nextInt(); //간선의 시작 정점
            int dst = sc.nextInt(); //간선의 도착 정점
            graph[src][dst] = 1; //(무방향)양방향이므로 src->dst, dst->src 둘 다 1로 초기화
            graph[dst][src] = 1; //(무방향)양방향이므로 src->dst, dst->src 둘 다 1로 초기화
        }
        dfs(v); //v번째 노드를 대상으로 깊이 우선 탐색
        System.out.println();
        visited = new boolean[n+1]; //방문 여부를 초기화 하기 위해 visited 배열을 false로 초기화
        bfs(v); //v번째 노드를 대상으로 너비 우선 탐색

    }

    static void dfs(int node) {
        visited[node] = true; //방문한 정점을 true로 변경
        System.out.print(node + " "); //방문한 정점 출력
        for (int i = 1; i <= n; i++) { //정점의 개수만큼 반복
            if (graph[node][i] == 1 && !visited[i]) { //정점 node에서 정점 i로 갈 수 있고, 정점 i를 방문하지 않았다면
                dfs(i); //재귀적으로 호출
            }
        }
    }

    //bfs 메소드는 큐를 이용하여 구현
    static Queue<Integer> q; //Queue 객체 생성
    static void bfs(int node) {
        q = new LinkedList<>(); //Queue 객체 생성
        q.add(node); //시작 정점을 큐에 삽입
        visited[node] = true; //시작 정점을 방문했으므로 true로 변경
        while (!q.isEmpty()) { //큐가 비어있지 않을 때까지 반복
            int cur = q.poll(); //큐에서 정점을 하나 꺼내서 cur에 저장
            System.out.print(cur + " "); //꺼낸 정점을 출력
            for (int i = 1; i <= n; i++) { //정점의 개수만큼 반복
                if (graph[cur][i] == 1 && !visited[i]) { //정점 cur에서 정점 i로 갈 수 있고, 정점 i를 방문하지 않았다면
                    q.offer(i); //큐에 정점 i를 삽입
                    visited[i] = true; //정점 i를 방문했으므로 true로 변경
                }
            }
        }
    }
}

//입력 과 출력
5 5 3
5 4
5 2
1 2
3 4
3 1
3 1 2 5 4 
3 1 4 2 5
반응형

'Algorithm' 카테고리의 다른 글

BFS and DFS with Java  (1) 2024.04.06
BFS and DFS with Java  (0) 2024.03.24
문자열에서 첫 번째 고유 문자 찾기  (0) 2023.10.29
문자열의 모든 순열  (0) 2023.10.29
가장 긴 공통 접두사  (0) 2023.10.29