정의

BFS(Breadth-First Search): 현재 노드에서 인접한 노드 탐색

DFS(Depth-First Search): 최대한 깊이 이동 후 다음 경로 탐색

  • 모든 노드를 탐색할 때의 시간 복잡도는 같지만, 그렇지 않을 경우 BFS가 더 빠르다.
  • DFS를 재귀로 구현할 때 스택 영역 오버플로우를 주의해야 한다.
  • DFS의 스택 구현은 방문 하다가 막히면 pop 하는 방식이다.
  BFS DFS
언제 사용할까? 최소 경로를 탐색할 때 경로의 특징을 저장해야 할 때
무엇으로 구현할까? queue stack 또는 재귀
시간복잡도 인접 리스트 O(V+E)
인접 행렬 O(n²)
인접 리스트 O(V+E)
인접 행렬 O(n²)

 

BFS 예시 코드

// 간선으로 이동

bool visited[101]; // 방문 배열 (중복 확인)
vector<int> edge[101]; // 정점 별 간선

void bfs() {
    queue<int> q;
    visited[1] = true;
    q.push(1);
    
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        
        for(int i = 0; i < edge[cur].size(); i++) {
        	int next = edge[cur][i];
            
            if(visited[next]) continue;
     		
            visited[next] = true;
            q.push(next);
        }
    }
}

 

DFS 예시 코드

// 연결된 간선으로 이동

bool is_cycle = false;
bool visited[101]; // 방문 배열 (중복 확인)
bool finished[101]; // 종료 배열 (사이클 확인)
vector<int> edge[101]; // 정점 별 간선

void dfs(int cur) {
	if(is_cycle) return;
	
    if(!visited[cur]) {
    	visited[cur] = true;
    	for(int i = 0; i < edge[cur].size(); i++) {
        	int next = edge[cur][i];
            dfs(next);
    	}
    }
    else if(visited[cur] && !finished[cur])
    	is_cycle=true;
        
    finished[cur] = true;
}