[백준] 1260번 - DFS와 BFS (C언어) [Silver2]

2023. 5. 28. 18:28·알고리즘

input1 output1 input1 output1
4 5 1
1 2 
1 3
1 4
2 4
3 4
1 2 4 3
1 2 3 4
5 5 3
5 4
5 2
1 2
3 4
3 1
3 1 2 5 4
3 1 4 2 5
해당 문제는 DFS와 BFS로 간선들을 탐색한 결과를 정점 번호로 출력하는 문제이다. 해당 문제를 해결하기 위해서는 DFS와 BFS의 개념을 알고 있어야 한다.

 DFS(깊이 우선 탐색)이란 트리의 깊은 부분을 먼저 탐색한다는 개념으로 볼 수 있다. DFS는 스택 혹은 재귀함수를 이용한다. DFS는 각 노드를 탐색할 때 주로 사용된다. 동작 과정은 아래와 같다.

  1. 첫 시작 노드(루트 노드)를 스택에 삽입하고 방문 표시를 한다.
  2. 스택의 최상단 노드를 확인하고 그 노드와 인접한 노드를 스택에 삽입하고 방문 표시를 한다. 만약 인접하는 노드가 없다면 스택에서 최상단 노드를 뺀다.
  3. 위 과정을 반복한다.

 BFS(너비 우선 탐색)이란 트리의 너비를 기준으로 탐색한다는 개념으로 볼 수 있다. BFS는 최단 경로를 찾는 경우에 많이 사용된다. BFS는 자료구조 중에서 큐를 사용한다. BFS 동작 과정은 아래와 같다.

  1. 첫 시작 노드(루트 노드)를 큐에 삽입하고 방문 표시를 한다.
  2. 큐에서 하나의 노드를 꺼낸다. 해당 노드와 연결된 노드중 방문하지 않는 노드를 방문하고 큐에 삽입한다.
  3. 2번 과정을 반복해서 큐가 비어있을 때 까지 반복한다.

전체 소스 코드는 아래와 같다.  (C언어로 작성하였지만 큐와 스택을 전부 구현하지 않고 DFS는 재귀함수로 BFS는 큐를 재현하여 풀이하였다.)

#include <stdio.h>
#include <stdbool.h>
#pragma warning(disable:4996)

int visited[1001] = { 0, }; // 방문 표시 초기화
int graph[1001][1001] = { 0, }; // 그래프 초기화
int queue[1001]; 

void dfs(int v,int n) { // 깊이 우선 탐색
	visited[v] = true;
	printf("%d ", v);
	for (int i = 1; i <= n; i++) {
		if (graph[v][i] && !visited[i]) // 그래프에 방문하지 않았고 간선 존재
			dfs(i, n);
	}
}

void bfs(int v, int n) { // 너비 우선 탐색
	/* 큐 변수 선언 */
	int front = 0;
	int rear = 1;
	int pop;

	visited[v] = true;
	printf("%d ", v);
	queue[0] = v;
	while (front < rear) { // 큐가 비어있으면 반복 종료 
		pop = queue[front++]; // dequeue 연산
		for (int i = 1; i <= n; i++){
			if (graph[pop][i] && !visited[i]) {
				visited[i] = true;
				printf("%d ", i);
				queue[rear++] = i; // enqueue 연산
			}
		}
	}
}

int main() {
	int n,m, v;

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

	for (int i = 0; i < m; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		graph[x][y] = 1; // 양방향 그래프
		graph[y][x] = 1;
	}

	visited[v] = true;
	dfs(v,n);

	for (int i = 1; i <= n; i++) // 방문 노드 초기화
			visited[i] = false;
	visited[v] = true;
	printf("\n");
	bfs(v, n);

	return 0;
}

'알고리즘' 카테고리의 다른 글

[백준] 1918번 - 후위 표기식 (C언어) [Gold2]  (0) 2023.05.30
[백준] 1937번 - 욕심쟁이 판다 (C언어) [Gold3]  (0) 2023.05.29
[백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]  (0) 2023.05.27
[백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]  (0) 2023.05.26
[백준] 1874번 - 스택 수열 (C언어) [Silver2]  (0) 2023.05.25
'알고리즘' 카테고리의 다른 글
  • [백준] 1918번 - 후위 표기식 (C언어) [Gold2]
  • [백준] 1937번 - 욕심쟁이 판다 (C언어) [Gold3]
  • [백준] 1407번 - 2로 몇 번 나누어질까 (C언어) [Gold4]
  • [백준] 1197번 - 최소 스패닝 트리 (C언어) [Gold4]
min._.uuk_
min._.uuk_
하루 하나 기록하기
  • min._.uuk_
    기록하는 습관
    min._.uuk_
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 알고리즘 (15)
      • 자바 스크립트 (2)
      • 인실리코젠 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    백준 #후위표기식 #스택 #중위표기식 #우선순위 #1918번
    백준 #세그먼트 트리 #구간합 #c언어 #골드1 #탐색
    백준 #동적계획법 #dp #백트래킹 #dfs
    #BOJ #백준 #10989번 #C언어 #카운팅정렬 #정렬
    JS #테트리스 #HTML #CSS #추억의 게임
    백준 #1407번 #재귀함수
    백준 #MST #최소비용신장트리 #크루스칼 #그리디 #알고리즘
    Apache #POI #JAVA #maven
    백준 #BOJ #스택 #수열
    인실리코젠 #크롤링 #SpringBoot #MVC #jQuery
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min._.uuk_
[백준] 1260번 - DFS와 BFS (C언어) [Silver2]
상단으로

티스토리툴바