728x90
- 자료구조
- 연결 리스트
- 이진 트리
- 스택
- 큐
- 해시
- 정렬
- 버블 정렬
- 선택 정렬
- 삽입 정렬
- 퀵 정렬
- 힙 정렬
- 알고리즘
- 재귀 함수
- 너비 우선탐색(BFS)
- 깊이 우선탐색(DFS)
- 다익스트라
너비 우선탐색(Breadth First Search)
- 시작 노드를 큐에 넣는다.
- Deque로 가져온 노드를 방문한 노드를 체크하는 v[]배열에 체크한다.
- 인접한 노드 중 방문하지 않은 노드를 큐에 넣어준다.
- 2~3번을 반복해준다.
소스코드
#define __main
#ifdef __main
#include <stdio.h>
#define MAX 128
typedef struct __Que {
int* que; // 큐
int max; // 큐의 최대입력 개수
int num; // 현재 큐에있는 데이터 개수
int front; // Deque할 위치
int rear; // Enque할 위치
} Que;
int v[MAX] = { 0 };
int xy[MAX][MAX] = { 0 };
void Init(Que* q, int max) {
q->que = malloc(sizeof(int) * max);
q->max = max;
q->front = q->rear = q->num = 0;
}
int Enque(Que* q, int x) {
if (q->num >= q->max) return -1; // 큐가 가득참
q->num++;
q->que[q->rear++] = x;
q->rear %= q->max; // 0 -> 1 -> ... -> max -> 0 -> 1
return 0;
}
int Deque(Que* q, int* x) {
if (q->num <= 0) return -1; // 큐가 비어있음
q->num--;
*x = q->que[q->front++];
q->front %= q->max; // 0 -> 1 -> ... -> max -> 0 -> 1
return 0;
}
void BFS(Que* q, int n, int start) {
int tmp = 0;
v[start] = 1;
Enque(q, start);
while (Deque(q, &tmp) == 0) {
printf("%d 번 노드 방문\n", tmp);
for (int i = 0; i < n; i++) {
if (xy[tmp][i] == 1 && v[i] == 0) {
Enque(q, i);
v[i] = 1;
}
}
}
}
int main() {
Que* q = malloc(sizeof(Que));
int n, m, start, x, y;
scanf("%d %d %d", &n, &m, &start);
Init(q, n);
for (int i = 0; i < m; i++) {
scanf("%d %d", &x, &y);
xy[x][y] = xy[y][x] = 1;
}
BFS(q, n, start);
free(q->que);
return 0;
}
/*
Test Input Data
10 9 0
0 1
0 2
0 3
3 4
3 6
4 8
6 7
7 9
5 9
*/
#endif
'프로그래밍 > C언어' 카테고리의 다른 글
[알고리즘] 다익스트라 (0) | 2020.11.25 |
---|---|
[알고리즘] 깊이 우선탐색(DFS) (0) | 2020.11.23 |
[알고리즘] 재귀 함수 (0) | 2020.11.19 |
[정렬] 힙 정렬 (0) | 2020.11.17 |
[정렬] 퀵 정렬 (0) | 2020.11.10 |