본문 바로가기

Algorithm/문제풀이

[백준] 1260번: DFS와 BFS

문제링크https://www.acmicpc.net/problem/1260

 

문제풀이

DFS는 보통 재귀 또는 스택을 이용해 풀고, BFS는 큐를 이용하여 구현한다.

이차원 배열로 두 정점이 연결되어 있는지 간선 정보를 저장해놓는다.

 

DFS : https://manzoo.tistory.com/69

 

[Algorithm] Depth-first-search (깊이 우선 탐색)

깊이 우선 탐색(depth-first search: DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택하고, 이 노드에 적용 가능한 동작자 중 하나를 적용하여 트리에 다음 수준(level)의 한 개의 자식노..

manzoo.tistory.com

BFS : https://manzoo.tistory.com/12?category=767113

 

[Algorithm] Breadth-first search (너비 우선 탐색)

너비 우선 탐색(Breadth-first search, BFS)은 맹목적 탐색방법의 하나로 시작 정점을 방문한 후 시작 정점에 인접한 모든 정점들을 우선 방문하는 방법이다. 더 이상 방문하지 않은 정점이 없을 때까지 방문하지..

manzoo.tistory.com

 

 

소스코드

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.LinkedList;
import java.util.Queue;

public class p_1260 {
	static int map[][];
	static boolean visit[];
	static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		StringTokenizer st = new StringTokenizer(s);

		N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int V = Integer.parseInt(st.nextToken());
		
		map = new int[N+1][N+1];
		visit = new boolean[N+1];
		
		for (int i = 0; i <= N; i++) {
			Arrays.fill(map[i], 0);
		}
		
		Arrays.fill(visit, false);
		
		for (int i = 0; i < M; i++) {
			String edge = br.readLine();
			st = new StringTokenizer(edge);

			int v1 = Integer.parseInt(st.nextToken());
			int v2 = Integer.parseInt(st.nextToken());
			
			map[v1][v2] = map[v2][v1] = 1;
		}

		dfs(V);
		System.out.println();
		Arrays.fill(visit, false);
		bfs(V);
	}
	
	public static void bfs(int v) {
		Queue queue = new LinkedList();
		queue.offer(v);
		visit[v] = true;
		System.out.printf(v + " ");
		while (!queue.isEmpty()) {
			int poll = queue.poll();
			for (int i = 1; i <= N; i++) {
				if (map[poll][i] == 1 && !visit[i]) {
					queue.offer(i);
					visit[i] = true;
					System.out.printf(i + " ");
				}
			}
		}
		for (int i = 1; i <= N; i++) {
			if (map[v][i] == 1 && !visit[i]) {
				bfs(i);
			}
		}
	}
	
	public static void dfs(int v) {
		visit[v] = true;
		System.out.printf(v + " ");
		for (int i = 1; i <= N; i++) {
			if (map[v][i] == 1 && !visit[i]) {
				dfs(i);
			}
		}
	}
}

 

'Algorithm > 문제풀이' 카테고리의 다른 글

[백준] 1697번: 숨바꼭질  (0) 2019.06.20
[백준] 2178번: 미로탐색  (0) 2019.06.20
[백준] 1912번: 연속합  (0) 2019.06.13
[백준] 1978번: 소수 찾기  (0) 2019.06.13
[백준] 1003번: 피보나치 함수  (0) 2019.06.12