[ 다먹살 ]/- Coding

[백준] 1260 DFS와 BFS

엉망으로살기 2021. 10. 6. 15:51
반응형

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

이제 확실히 DFS, BFS에 대해서 좀 익숙해진 것 같다. DFS 부분 같은 경우에는 Stack을 사용할까도 고민해봤는데 이렇게 하면 따로 정렬해주는 부분을 구현해야 해서 그냥 재귀로 해결했다.


문제 및 입출력

 


코드

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main
{
        public static void bfs(int[][] graph, boolean[] visit, int start)
        {
                Queue<Integer> q = new LinkedList<Integer>();
                start--;
                visit[start] = true;
                q.add(start);


                while(!q.isEmpty())
                {
                     start = q.peek();
                     System.out.println((q.poll()+1) + " ");

                     for(int i=0; i<graph[start].length; i++)
                     {
                          if(start!=i && graph[start][i]==1 && !visit[i])
                          {
                               visit[i] = true;
                               q.add(i);
                          }
                     }
                }
            }
            // 재귀를 사용한 dfs
            public static void dfs(int[][] graph, boolean[] visit, int start)
            {
                 start--;
        
                 if(visit[start])
                 {
                      return;
                 }
        
                 visit[start] = true;
                 System.out.println((start+1) + " ");
        
                 for(int i=0; i<graph[start].length; i++)
                 {
                      if(graph[start][i]==1 && !visit[i])
                      {
                           dfs(graph, visit, i+1);
                      }
                 }
            }
            public static void main(String[] args)
            {
                 Scanner sc = new Scanner(System.in);
                 int n = sc.nextInt();
                 int m = sc.nextInt();
                 int v = sc.nextInt();
        
                 int[][] graph = new int[n][n];
                 boolean[] visit = new boolean[n];
        
                 for(int i=0; i<m; i++)
                 {
                      int start = sc.nextInt();
                      int end = sc.nextInt();
            
                      graph[start-1][end-1] = 1;
                      graph[end-1][start-1] = 1;
                 }
        
                 dfs(graph, visit, v);
                 System.out.println();
                 Arrays.fill(visit, false);
                 bfs(graph, visit, v);
            }
     }

 

반응형