본문 바로가기

[BOJ] - JAVA

[백준] 1260 : DFS와 BFS JAVA 풀이

 

인접행렬 방식으로 풀었다.

 

import java.io.*;
import java.util.*;
public class Main {
	// 인접행렬 생성
	static int[][] graph;
    // 방문했는지 확인하기 위한 행렬
	static boolean[] visit;
    // 정점의 개수
	static int N;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        // 정점의 개수
		N = Integer.parseInt(st.nextToken());
        // 간선의 개수
		int M = Integer.parseInt(st.nextToken());
        // 시작 정점
		int V = Integer.parseInt(st.nextToken());
		
        // [정점의 개수+1][정점의 개수+1]
		graph = new int[N+1][N+1];
		visit = new boolean[N+1];
		
        // 인접행렬에 간선 체크
		for(int i=0;i<M;i++) {
			st = new StringTokenizer(br.readLine()," ");
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			graph[x][y] = 1;
			graph[y][x] = 1;
		}
		
     	
		dfs(V);
		System.out.println();
		
        // dfs 수행 뒤 방문한 정점을 다시 초기화
		for(int i=0;i<visit.length;i++)visit[i] = false;
		
		bfs(V);
	}
	
	public static void dfs(int v) {
    	// 정점을 방문했다고 체크
		visit[v] = true;
        // 방문한 정점 출력
		System.out.print(v+" ");
		
		for(int i=1;i<N+1;i++) {
        	// 인접 정점 중 아직 미방문인 정점에 대해 dfs 재귀호출
			if(graph[v][i]==1&&visit[i]==false) {
				dfs(i);
			}
		}
	}
	
  
	public static void bfs(int v) {
    	// 큐 생성
		Queue<Integer> q = new LinkedList<>();
        // 정점을 큐에 추가
		q.offer(v);
        // 정점을 방문했다고 체크
		visit[v] = true;
		
        // 큐가 빌 때까지 반복
		while(!q.isEmpty()) {
        	// 큐에서 수 하나를 제거
			int tmp = q.poll();
            // 출력
			System.out.print(tmp+" ");
			
            // 큐에서 제거한 정점의 인접 정점을 큐에 넣고 방문했다고 체크
			for(int i=1;i<N+1;i++) {
				if(graph[tmp][i]==1&&visit[i]==false) {
					q.offer(i);
					visit[i] = true;
				}
			}
		}
	}

}