그래프 용어

  • 정점(vertex)
  • 노드(node)
  • 간선(edge): 정점을 잇는 선
  • 그래프(graph): 노드와 그들을 잇는 간선으로 이루어짐
  • 이웃노드(neighbor), 인접한 노드(adjacent): 두 노드를 잇는 간선이 있을 때, 두 노드를 이웃노드라 함

DFS(Depth-First Search)란?

깊이 우선 탐색이라고 부른다.
루트 노드에서 시작하여 해당 노드의 자식 노드를 우선적으로 탐색
스택 또는 재귀함수로 구현

BFS(Breadth-First Search)란?

너비 우선 탐색이라고 부른다.
루트 노드에서 시작하여 해당 노드의 인접 노드를 우선적으로 탐색한다.
큐(Queue)로 구현

문제 유형

DFS 유형: 이동할 때마다 가중치가 있거나 이동 과정에서 여러 제약이 있는 경우
BFS 유형: 단순한 최단 경로 찾는 문제

탐색 순서

그래프
DFS: 1, 2, 3, 5, 4, 6
BFS: 1, 2, 6, 3, 4, 5

c++ 구현

edge[1] = {2, 6}
edge[2] = {1, 3, 4, 6}
edge[3] = {2, 5}
edge[4] = {2, 5}
edge[5] = {3, 4}
edge[6] = {1, 2}

=> DFS
c(checked) 배열을 이용해 특정 노드를 방문했으면 그 노드를 방문했다고 체크한다.
edge 벡터를 이용해 각 노드의 인접한 노드가 무엇인지 미리 main 함수에서 입력 받을 때 기록해둔다.

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;

bool c[10];
vector <int> edge[10];

void dfs(int x) {
  c[x] = 1;
  cout << now << "번 노드를 방문" << "\n";

  for (int i = 0; i < edge[now].size(); i++) {
    int next = edge[now][i];
    if (!c[next]) dfs(next);
  }
}

=> BFS
현재 노드에서 아직 방문하지 않았고, 이웃한 노드를 push로 큐에 추가
q.front()로 큐에서 가장 앞쪽에 있는 노드 찾고 방문 (현재 노드가 됨)
방문 했으니 q.pop()으로 큐에서 삭제함

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;

bool c[10];
vector <int> edge[10];
queue <int> q;

void bfs(int x) {
	c[x] = 1;
	q.push(x);

	while (!q.empty()) {
		int now = q.front();
		q.pop();
		cout << now << "번 노드를 방문" << "\n";

		for (int i = 0; i < edge[now].size(); i++) {
			int next = edge[now][i];
			if (!c[next]) {
				c[next] = 1;
				q.push(next);
			}
		}
	}
}

댓글남기기