Yeon's 개발블로그

지식을 전파하는 개발자가 되고싶습니다.

Algorithms/BFS DFS

[c++] 백준 1260: DFS와 BFS

Dev.yeon 2021. 5. 12. 15:01

1) 문제   

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

2) 입력   

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

3) 출력   

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다. 

4) 해결방법   

아주 단순한 bfs, dfs 코드를 짜는 문제이다. bfs, dfs의 개념만 익히면 코드를 짜는 것은 쉽다. 다만, dfs는 스택을 이용하여 구현해야 원하는 출력문 결과를 낼 수 있다. 밑의 블로그 링크에서 dfs와 bfs의 개념을 익히고 오는 것을 추천한다. 

2021.05.11 - [Algorithms] - [c++] BFS와 DFS

 

[c++] BFS와 DFS

BFS, DFS란? 그래프를 탐색하는 방법으로는 BFS와 DFS가 있다. BFS(Breadth-First Search)는 너비우선탐색이고, DFS(Depth-First Search)는 깊이우선탐색이다. BFS는 최대한 옆으로 넓게 이동하는 방법으로, 더이..

yeon-code.tistory.com

 

5) 전체코드

#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>

using namespace std;

void dfs(int start, vector<vector<int>>graph, vector<bool> check) {
	stack <int> s;
	s.push(start);
	check[start] = true;
	cout << start << " ";

	while (!s.empty()) {
		int temp = s.top();
		s.pop();
		for (int i = 0; i < graph[temp].size(); i++) {
			int next = graph[temp][i];
			if (check[next] == false) {
				cout << next << " ";
				check[next] = true;
				s.push(temp);
				s.push(next);
				break;
			}
		}
	}
	
}

void bfs(int start, vector<vector<int>>graph, vector <bool> check) {
	queue<int> q;
	q.push(start);
	check[start] = true;
	while (!q.empty()) {
		int temp = q.front();
		q.pop();
		cout << temp << " ";
		for (int i = 0; i < graph[temp].size(); i++) {
			if (check[graph[temp][i]] == false) {
				q.push(graph[temp][i]);
				check[graph[temp][i]] = true;
			}
		}
	}
}

int main() {
	int n, m, start;
	cin >> n >> m >> start;
	vector<vector<int>> graph(n+1);
	vector<bool>check(n + 1);
	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;
		graph[u].push_back(v);
		graph[v].push_back(u);
	}

	for (int i = 1; i <= n; i++)
		sort(graph[i].begin(), graph[i].end());

	dfs(start, graph, check);
	cout << "\n";
	bfs(start, graph, check);
}

 

www.acmicpc.net/problem/1260
 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

'Algorithms > BFS DFS' 카테고리의 다른 글

[c++] 백준 2606: 바이러스  (0) 2021.05.12
[c++] 백준 15652: N과 M(4)  (0) 2021.04.30
[c++] 백준 15651: N과 M(3)  (0) 2021.04.30
[c++] 백준 15650: N과 M(2)  (0) 2021.04.30
[c++] 백준 15649: N과 M  (0) 2021.04.30