ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1260 DFS와 BFS
    알고리즘/백준 2022. 3. 25. 00:28

    백준 1260 DFS와 BFS : https://www.acmicpc.net/problem/1260

     

    1260번: DFS와 BFS

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

    www.acmicpc.net

    [개념(간단하게 정리)]

    출처 : https://bit.ly/3tzayLq

    깊이 우선 탐색(DFS, Depth First Search)

    탐색 방법 : 현재 노드에서 분기를 완벽하게 탐색 후 다음 분기로 넘어감의 반복

    • 스택으로 구현 가능

     

    너비 우선 탐색(BFS, Breadth First Search)

    탐색 방법 : 현재 노드에서 연결된 노드를 모두 방문하면 다음 노드로 넘어가 또 그노드에 연결된 노드를 모두 방문의 반복

    • 큐로 구현 가능
    • 특정 노드 사이의 최단 경로를 확인하고 싶을 때 사용
      • BFS를 사용해야 모든 노드를 방문 안해도 됨, DFS의 경우 모든 노드를 방문해야함.

     

    [문제 풀이 전]

    DFS 함수

    • 재귀함수로 구현

    BFS 함수

    • 반복문 + 큐 사용

     

    [문제풀이]

    #include<iostream>
    #include<queue>
    using namespace std;
    #define MAX 1001
    
    int N, M, V;
    int map[MAX][MAX] = {};
    bool check[MAX] = {};
    
    void DFS(int v) {
    	cout << v << " ";
    	check[v] = true;
    
    	for (int i = 1; i <= N; i++) {
    		if (map[i][v] == 1 && !check[i]) DFS(i);
    	}
    }
    
    void BFS() {
    	queue<int> q;
    	q.push(V);
    	cout << V << " ";
    	check[V] = true;
    
    	while (!q.empty())
    	{
    		int v = q.front(); q.pop();
    		for (int i = 1; i <= N; i++) {
    			if (map[i][v] == 1 && !check[i]) {
    				q.push(i);
    				cout << i << " ";
    				check[i] = true;
    			}
    		}
    	}
    	
    }
    
    int main() {
    
    	ios_base::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    
    	cin >> N >> M >> V;
    	for (int i = 1; i <= M; i++) {
    		int v1, v2;
    		cin >> v1 >> v2;
    		map[v1][v2] = 1;
    		map[v2][v1] = 1;
    	}
    
    	DFS(V);
    	for (int i = 1; i <= N; i++) {
    		check[i] = false;
    	}
    	cout << "\n";
    	BFS();
    
    	return 0;
    
    }
    bool check[MAX] 해당 노드를 방문했는지 확인하는 배열

    DFS(int v)
    int v 현재 기준이 되는 노드, 해당 노드의 분기를 탐색 후 다음 분기로 넘어감. 
    ① 현재 기준이 되는 노드를 출력 및 check
    ② 배열을 탐색하며 연결된 노드가 있으면 DFS(i)로 깊이 우선 탐색 
    BFS()


    queue<int> q 너비 우선 탐색을 위해 방문한 노드를 저장하는 큐
    int v 현재 기준이 되는 노드, 해당 노드에 연결된 노드들을 모두 확인
    ① 입력받은 V값 q에 저장 및 출력
    ② 큐에 저장된 값을 빼며 while 반복문 진행, 더이상 없을 경우 탈출
    ③ for 반복문에서 v와 연결된 노드를 모두 확인 및 출력 후 큐에 방문 노드 저장

    [comment]

    DFS, BFS는 이미 배운거라 쉽게 구현함, 또 문제가 쉬어서 단순한 스택 큐 문제로 보고 해결할 수 있었다.

    과거 배운 내용 복습하는 느낌으로 풀어봤다. 

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

    11066 파일 합치기  (0) 2022.04.01
    2805 나무 자르기  (0) 2022.03.23
    1920 수 찾기(이분탐색)  (0) 2022.03.23
    6549 히스토그램에서 가장 큰 직사각형  (0) 2022.03.21
    2630 색종이 만들기  (0) 2022.03.17

    댓글

Designed by Tistory.