-
Chpter 6-1 : Graph (DFS & BFS)자료구조 2021. 12. 12. 22:27728x90
자료구조인 그래프를 탐색하는 방법입니다.
#define MAX_VERTICES 50 typedef struct node* node_pointer; typedef struct node { int vertex; node_pointer link; }; node_pointer graph[MAX_VERTICES]; int n = 0;
기본 설정입니다.
변수 n은 현재 사용하고 있는 정점의 갯수 를 나타냅니다.
DFS (깊이 우선 탐색)
Root node 한개를 선택해 하나의 자식 노드를 집중적으로 계속 탐색하고 탐색이 끝나면
Root node의 다음 자식 노드를 선택해 또 탐색하는 방법입니다.
void dfs(int v) { node_pointer w; visited[v] = TRUE; printf("%5d", v); for (w = gragh[v]; w; w = w->link) if (!visited[w->vertex]) dfs(w->vertex); }
visited 배열은 탐색했던 정점을 TRUE로 만들어 주어서 중복 방문하는것을 방지해줍니다.
처음에 모든 visited 배열은 FALSE로 초기화 됩니다.
처음에 저런 모양으로 되어있습니다.
0 -> 1 -> 2 ->3 이 순서로 탐색하게 됩니다.
BFS (너비 우선 탐색)
인접한 Node들을 먼저 탐색하는 것입니다.
BFS는 큐로 구현합니다.
typedef struct queue* queue_pointer; typedef struct queue { int vertex; queue_pointer link; }; queue_pointer front, rear; void addq(int); int deleteq();
다음과 같은 초기화가 필요합니다.
void bfs(int v) { node_pointer w; front = rear = NULL; printf("%5d", v); visited[v] = TRUE; addq(v); while (front) { v = deleteq(); for (w = graph[v]; w; w = w->link) { if (!visited[w->vertex]) { printf("%5d", w->vertex); addq(w->vertex); visited[w->vertex] = TRUE; } } } }
0 -> 1 -> 3 -> 2 이 순서로 탐색을 진행합니다.
'자료구조' 카테고리의 다른 글
map (0) 2022.07.27 Chapter 5-5 : Tree (Disjointset(Union & Find)) (0) 2021.12.11 Chapter 5-4 : Tree (Binary Search Tree) (0) 2021.12.09 Chapter 5-3 : Tree (Heaps) (0) 2021.12.03 Chapter 5-1 : Tree (Binary Tree Traversal 이진 트리 순회) (0) 2021.11.29