본문 바로가기
알고리즘/백준

[백준 1260] DFS와 BFS - 자바

by binghe819 2020. 4. 4.

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

www.acmicpc.net

 

1. 풀이


이 문제는 DFS와 BFS의 구현을 하는 문제입니다.

 

그래프를 구성하는 방법은 인접 리스트와 인접 행렬이 있습니다. 

 

둘 중 아무거나 선택해서 구현을 하면 되지만, 저는 인접 행렬을 통해서 구현했습니다.

 

주의할 점은 DFS에서 스택을 통한 구현과, 재귀를 통한 구현이 있는데요.

 

이 문제에서의 DFS는 재귀를 통한 방식의 방문을 하므로, 재귀를 통해 풀어야합니다. ( 물론 스택을 통한 방법도 있을겁니다. )

 

2. 코드


import java.util.*;

public class Main {
	
	static int V; // vertex
	static int E; // Edge
	static boolean[] visited;
	static int[][] graph;
	static int startPoint;
	
	static void dfs(int index) {
		if(visited[index] == true)
			return;
		else
			visited[index] = true;
		System.out.print(index+" ");
		
		for(int i = 1; i <= V; i++) {
			if(graph[index][i] == 1 && visited[i] != true) {
				dfs(i);
			}
		}
	}
	
	static void bfs(int index) {
		Queue<Integer> queue = new LinkedList<Integer>();
		visited[index] = true;
		queue.offer(index);
		System.out.print(index+" ");
		
		int tmp;
		while(!queue.isEmpty()) {
			tmp = queue.poll();
			for(int i = 0; i < V+1; i++) {
				if(graph[tmp][i] == 1 && visited[i] != true) {
					queue.offer(i);
					visited[i] = true;
					System.out.print(i+" ");
				}
			}
		}
		
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		graph = new int[1001][1001];
		visited = new boolean[10001];
		V = sc.nextInt();
		E = sc.nextInt();
		startPoint = sc.nextInt();
		
        // 간선 연결
		int a,b;
		for(int i = 0; i < E; i++) {
			a = sc.nextInt();
			b = sc.nextInt();
			
			graph[a][b] = graph[b][a] = 1;
		}
		
		dfs(startPoint); // dfs
		
		// visit 초기화
		for(int i = 0; i <= V; i++)
			visited[i] = false;
		System.out.println();
		
		bfs(startPoint); // bfs
		
		sc.close();
		return;
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1924] 2007년  (0) 2020.04.11
[백준 1697] 숨바꼭질 - 자바  (0) 2020.04.05
[백준 1946] 신입 사원  (0) 2020.04.03
[백준 1120] 문자열 - 자바  (0) 2020.04.03
[백준 1541] 잃어버린 괄호  (0) 2020.04.03

댓글