발효홍삼
코딩하는 홍삼
발효홍삼
전체 방문자
오늘
어제
  • 분류 전체보기 (142)
    • PS (63)
      • 프로그래머스 (9)
      • 코드업 (10)
      • 백준 (43)
      • 알고스팟 (1)
    • Programming Language (11)
      • html_css (2)
      • java (0)
      • c,c++ (2)
      • vanillajs (2)
      • react (0)
      • vue.js (0)
      • angular.js (0)
      • electron (3)
      • 엄랭(Umjunsik-lang) (1)
      • F# (1)
      • Node.js (0)
      • Go (0)
    • knowledge (41)
      • algorithm (3)
      • data structure (1)
      • os (1)
      • ML (1)
      • math (31)
      • paper review (0)
      • IT-license (4)
    • Programming Guide (27)
      • React (1)
      • Electron (2)
      • CSS , SASS ( SCSS ) , Tailw.. (3)
      • Node.js (1)
      • Go (1)
      • Ruby on Rails (2)
      • R (1)
      • PHP (1)
      • Docker (1)
      • JSP (1)
      • C# (1)
      • Django (1)
      • Flask (1)
      • Dart (1)
      • Next.js (1)
      • Vue.js (1)
      • Unity (1)
      • React Native (0)
      • Flutter (3)
      • GraphQL (1)
      • MongoDB (1)
      • .NET (1)
      • RUST (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 정보처리기능사 필기
  • nodejs
  • 코드업
  • C
  • 파이썬
  • 프로그래머스
  • java
  • 정보처리기능사
  • 미분
  • cpp
  • HTML
  • 기초백제
  • 자바
  • 구현
  • JavaScript
  • LV1
  • 출력
  • Python
  • c++
  • 백준
  • 이산수학
  • 적분
  • electron
  • 기초100제
  • 수학
  • CSS
  • codeup
  • js
  • 미적분학

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
발효홍삼

코딩하는 홍삼

[ 알고리즘 ] DFS ( 깊이 우선 탐색 ) 와 BFS ( 너비 우선 탐색 )의 이해 및 구현
knowledge/algorithm

[ 알고리즘 ] DFS ( 깊이 우선 탐색 ) 와 BFS ( 너비 우선 탐색 )의 이해 및 구현

2022. 3. 14. 01:04
728x90

트리나 그래프를 탐색하는 방법은 크게 DFS 알고리즘과 BFS알고리즘 , 두 가지로 나누어진다.

 

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

DFS란 시작점부터 다음 분기로 넘어가기 전 해당 분기를 완전히 탐색하는 방법을 말한다.

 

출처 https://developer-mac.tistory.com/64

DFS는 재귀함수나 스택으로 구현되며 모든 분기를 탐색하고자 할 때 사용된다.

DFS는 아래 서술할 BFS보다 구현은 쉽지만 탐색 속도가 느리다.

 

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

BFS란 임의의 노드 ( 주로 root 노드 ) 부터 인접한 노드들을 먼저 탐색하는 방법을 말한다.

즉 시작 정점에서 가까운 노드들부터 먼저 방문하고 멀리 있는 노드는 비교적 나중에 탐색하는 순환 방법이라 할 수 있겠다.

 

출처 https://developer-mac.tistory.com/64

BFS는 주로 큐를 이용해 구현된다. 

 

3. DFS와 BFS의 장단점

3-1. dfs

dfs는 현 분기만의 노드만 기억하면 되기 때문에 저장 공간이 적게 필요하다는 장점이 있으며 목표 노드가 깊이 있는 경우 bfs보다 빨리 구할 수 있다.

 

하지만 무한한 길이를 가지는 분기가 있는 경우 영원히 종료하지 못하고 얻은 해가 최단 경로가 아닐 수 있다는 단점이 존재한다.

 

3-2. bfs

bfs는 최적해를 보장한다.

 

하지만 최악의 경우, 가장 긴 시간이 걸릴 수 있으며 최소 실행 시간보다 오래 걸린다는 게 거의 확실하다는 단점이 있다.

 

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

 

#include <stdio.h>
#include <queue>
#include <vector>
#define MAX 1001

using namespace std;
int visit[MAX];
int n,m,v; //정점 개수 , 간선 개수 , 시작정점
queue <int> Q; 
int map[MAX][MAX];

void clear()
{
	for (int i = 1; i <= n; i++)
		visit[i] = 0;
}

void dfs(int start)
{
	visit[start] = 1;
	printf("%d ", start);

	for (int i = 1; i <= n; i++) {
		if (map[start][i] == 1 && visit[i] == 0)
		{
			dfs(i);
		}	
	}
}

void bfs(int start)
{
	Q.push(start);
	visit[start] = 1;
	printf("%d ", start);

	while (!Q.empty()) {
		int tmp = Q.front();
		Q.pop();

		for (int i = 1; i <= n; i++)
		{
			if (map[tmp][i] == 1 && visit[i] == 0) {
				Q.push(i);
				visit[i] = 1;
				printf("%d ", i);
			}
		}
	}
}

int main()
{
	scanf("%d %d %d", &n, &m, &v);

	for (int i = 0; i < m; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		map[a][b] = 1;
		map[b][a] = 1;
	}

	clear();
	dfs(v);

	printf("\n");

	clear();
	bfs(v);
}
728x90
저작자표시 비영리 (새창열림)

'knowledge > algorithm' 카테고리의 다른 글

[ 알고리즘 ] 동적 계획법 ( Dynamic Programming, DP )의 이해와 구현 with C++  (0) 2022.03.21
[ 알고리즘 ] 투포인터 ( Two Pointer )의 이해 및 구현  (0) 2022.03.17
    'knowledge/algorithm' 카테고리의 다른 글
    • [ 알고리즘 ] 동적 계획법 ( Dynamic Programming, DP )의 이해와 구현 with C++
    • [ 알고리즘 ] 투포인터 ( Two Pointer )의 이해 및 구현
    발효홍삼
    발효홍삼
    코딩하는 홍삼

    티스토리툴바