본문 바로가기

Algorithm/BFS

BaekJoon 1260 DFS와 BFS

Link https://www.acmicpc.net/problem/1260

소스결과 2968 KB 8 ms

출처 Backjoon

언어 C++ 17

 

설명

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

BFS ( Breadth - First - Search ) 넓이 우선 탐색

 

DFS Page : https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html

BFS Page : https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html

 

이번 문제에서 보이는 DFS와 BFS 의 차이는

순서 뿐만이 아니라 DFS는 재방문을 함수 스택에 넣을 때 검사 하고 BFS는 queue에서 꺼냈을때 검사한다는 것이다.

BFS는 깊이를 우선순위로 보기 때문에 공통된 자식이 있을 경우 중복된 값을 넣을 수 있다.

queue에 넣을 때 방문한 것으로 판단 하게 하는 방법도 존재하지만 밑의 소스에서는 그 방법을 사용하지 않았다.

 

알고리즘

1. 정점의 수와 간선, 시작지점을 입력받는다.

2. DFS를 수행하며 출력

3. BFS를 수행하며 출력

 

소스코드

#include <iostream>
#include <queue>

using namespace std;

int n;
bool adjMat[1000][1000];
bool dfsCheck[1000];
bool bfsCheck[1000];

void DFS(int pos)
{
	// 방문 확인
	dfsCheck[pos] = true;
	cout << pos + 1 << ' ';

	for (int i = 0; i < n; i++)
	{
		if (adjMat[pos][i] && !dfsCheck[i])
			DFS(i);
	}
}

int main()
{
	int m, start;
	queue<int> q;

	cin >> n >> m >> start;

	for (int i = 0; i < m; i++)
	{
		int x, y;
		cin >> x >> y;
		adjMat[x - 1][y - 1] = adjMat[y - 1][x - 1] = true;
	}
	
	// DFS 실행
	DFS(start-1);

	// DFS BFS 구분
	cout << '\n';

	// BFS
	q.push(start - 1);
	
	while (!q.empty())
	{
		int cur = q.front();
		q.pop();

		// 재 방문시 출력하지 않고 다음 노드 탐색
		if (bfsCheck[cur])
			continue;

		bfsCheck[cur] = true;
		cout << cur + 1 << ' ';

		for (int i = 0; i < n; i++)
		{
			if (adjMat[cur][i])
				q.push(i);
		}
	}

	return 0;
}

 

'Algorithm > BFS' 카테고리의 다른 글

BaekJoon 7562 나이트의 이동  (0) 2019.01.09
BaekJoon 7576 토마토  (0) 2019.01.09
BaekJoon 1697 숨바꼭질  (0) 2019.01.08
BaekJoon 2667 단지번호붙이기  (0) 2019.01.05
BaekJoon 2468 안전영역 (BFS)  (0) 2019.01.01