본문 바로가기

코딩 및 기타/코딩 테스트 준비

DFS

728x90

DFS

그래프를 탐색할 때 쓰는 알고리즘이며 어떤 노드부터 시작해 인접한 노드들을 재귀적으로 방문하며 방문한 정점은 다시 방문하지 않으며 각 분기마다 가능한 가장 멀리 있는 노드까지 탐색하는 알고리즘

 

DFS(u, adj){
	u.visited = true;
    for (each = adj[u]){
    	if (v, visited == 0)
        	DFS(u, adj)
    }
}

 

#include <iostream>
#include <vector>

using namespace std;

const int v = 10;
vector<int> adj[v];
int visited[v];

void dfs(int u){
    visited[u] = true;
    cout << u << '\n';
    for (int v : adj[u]){
        if (visited[v] == 0){
            dfs(v);
        }
    }
    cout << u << " 로 부터 함수 종료" << '\n';
}

int main()
{
    adj[1].push_back(2);
    adj[1].push_back(3);
    adj[2].push_back(4);
    adj[4].push_back(2);
    adj[2].push_back(5);
    dfs(1);
}

 

 

1. 구현 방법 : 돌다리를 두들겨 보기

void dfs(int here){
	visited[here] = 1;
    for (int there : adj[here]){
    	if (visited[there]) continue;
        dfs(there);
    }
}

 

2. 못 먹어도 GO

void dfs(int here){
	if (visited[here]) return;
    visited[here] = 1;
    for (int there : adj[here]){
    	dfs(there);
    }
}

 

 

ex) 

#include <iostream>

using namespace std;

int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
int m, n, k, y, x, ret, ny, nx, t;
int a[104][104];
bool visited[104][104];

void dfs(int y, int x){
    visited[y][x] = 1;
    // 4방향
    for (int i = 0; i < 4; i++){
        ny = y + dy[i];
        nx = x + dx[i];
        if (ny < 0 || nx < 0 || ny >= n || nx >= m) continue;
        if (a[ny][nx] == 1 && !visited [ny][nx]){
            dfs(ny, nx);
        }
    }
}

int main()
{
    cin >> n >> m;
    // 입력 받는 부분
    for (int i = 0 ; i < n; i++){
        for (int j = 0; j < m; j++){
            cin >> a[i][j];
        }
    }
    
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            if (a[i][j] == 1 && !visited[i][j]){
                ret++;
                dfs(i, j);
            }
        }
    }
    cout << ret << '\n';
}


/*
 5 5
 1 0 1 0 1
 1 1 0 0 1
 0 0 0 1 1
 0 0 0 1 1
 0 1 0 0 0
 
 4
 */

'코딩 및 기타 > 코딩 테스트 준비' 카테고리의 다른 글

BFS  (0) 2023.11.17
2주차(개념)  (0) 2023.11.09
1주차 (개념)  (0) 2023.10.27
[필수 개념] 중복된 요소 제거 방법 과 unique()  (0) 2023.10.26
[필수 개념] Split  (0) 2023.10.23