백준 문제풀이/GRAPH

[BFS] BOJ 11724 : 연결 요소

준코딩 2019. 7. 24. 06:14
백준 알고리즘 강의를 토대로 작성된 문제풀이입니다.
DFS 와 BFS 의 개념에 대해서는 지난 포스트를 봐주세요.
DFS : 2019/05/23 - [프로그래밍/알고리즘] - [알고리즘] 깊이 우선 탐색(DFS, Depth-First Search)
BFS : 2019/05/26 - [프로그래밍/알고리즘] - [알고리즘] 너비 우선 탐색(BFS, Breadth-First Search)
예제 : 2019/07/22 - [프로그래밍/1일1백준] - [Graph] BOJ 1260 : DFS 와 BFS

 

 

문제


방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력


첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

 

 

출력


첫째 줄에 연결 요소의 개수를 출력한다.

풀이


 

 

 

바로 직전 포스트에서 for문 하나만 추가하면 풀 수 있는 간단한 문제입니다.

직전 포스트는 여기로 가시면 됩니다.

 

 

정점이 1, 2, 3, 4 네개가 있는데

1 - 2 , 3 - 4 이렇게 간선은 두 개만 연결되어 있다고 합시다.

 

 

이 상태에서 일반적인 bfs(1)을 하게 되는 경우

즉, 1을 시작으로 너비 우선 탐색을 하는 경우 1과 2를 탐색하고

더 이상 연결되어있는 정점이 없기때문에 탐색을 마치게 됩니다.

 

 

그래서!! 저희는 모든 정점을 돌기위해서 모든 정점을 시작점으로 해주는

for문을 만들게 됩니다.

이때 주의하실점은 이미 탐색을 한 정점은 넘어가야 한다는 겁니다.

이렇게 for문을 통해서 bfs를 시작할 때마다 연결 요소의 개수를 하나씩 체크만 해주면

문제는 해결됩니다.

 

더 자세한 설명을 원하시면 댓글을 통해 말해주세요. ㅎㅎ

코드는 정답 코드와 연결 요소 내부의 정점들을 모두 표시한 코드를 올려놨습니다.

 

 

 

 

정답 코드


 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

vector<int> a[1001];
bool check[1001];

void bfs(int node) {
			bool end = true;
			queue <int> q;
			check[node] = true;
			q.push(node);

			while (!q.empty()) {
				int next = q.front();
				q.pop();

				for (auto elements : a[next]) {
					if (!check[elements]) {
						q.push(elements);
						check[elements] = true;
					}
				}

			}
		}
	



int main() {

	int u, v;
	cin >> u >> v;

	for (int i = 0; i < v; i++) {
		int x, y;
		cin >> x >> y;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	int components = 0;
	for (int i = 1; i <= u; i++) {
		if (check[i] == false) {
			bfs(i);
			components += 1;
		}
	}
	cout << components;
	return 0;
}

 

 

노드 값을 전부 출력한 코드


#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

vector<int> a[1001];
bool check[1001];
int component = 0;

void bfs(int u) {
	for (int node = 1; node < u;node++) {
		if (!check[node]) {
			cout << "---------" << component + 1 << "번째 연결요소------" << '\n';
			bool end = true;
			queue <int> q;
			check[node] = true;
			cout << node << ' ';
			q.push(node);

			while (!q.empty()) {
				int next = q.front();
				q.pop();

				for (auto elements : a[next]) {
					if (!check[elements]) {
						q.push(elements);
						cout << elements << ' ';
						check[elements] = true;
					}
				}

			}
			cout << '\n';
			component++;
		}
	}
	cout << "연결요소 : " << component << endl;
}


int main() {

	int u, v;
	cin >> u >> v;

	for (int i = 0; i < v; i++) {
		int x, y;
		cin >> x >> y;
		a[x].push_back(y);
		a[y].push_back(x);
	}

	bfs(u);
	return 0;
}