Study hard

(c++)백준 11724번: 연결 요소의 개수 본문

백준/bfs, dfs

(c++)백준 11724번: 연결 요소의 개수

Nimgnoej 2020. 6. 18. 19:47

https://www.acmicpc.net/problem/11724

 

11724번: 연결 요소의 개수

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

www.acmicpc.net

[풀이]

연결 요소 : 한 개 이상의 간선으로 연결된 정점들로 이루어진 그래프.(서로 아무 관련 없는 각각의 그래프)

연결 요소 조건

- 연결 요소에 속한 모든 정점을 잇는 경로가 존재해야 함.

- 다른 연결 요소에 속하는 정점과 이어지는 경로가 있으면 안됨.

 

방문을 체크하는 배열을 만들어서 체크하지 않은 정점을 시작점으로 bfs를 돌린다.

bfs를 돌린 횟수가 연결요소의 개수이다.

 

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

int N, M;
int Graph[1001][1001] = { 0, };//정점 연결되어 있으면 1
bool check[1001] = { false, };

void input() {
	cin >> N >> M;
	for (int i = 0; i < M; i++) {
		int u, v;
		cin >> u >> v;
		Graph[u][v] = 1;
		Graph[v][u] = 1;
	}
}

void bfs(int start) {
	queue<int>q;
	q.push(start);
	check[start] = true;
	while (!q.empty()) {
		int cur = q.front();
		q.pop();
		for (int i = 1; i <= N; i++) {
			if (Graph[cur][i] == 1 && check[i] == false) {
				check[i] = true;
				q.push(i);
			}
		}
	}
}

void solution() {
	input();
	int cnt = 0;//연결 요소 개수
	for (int i = 1; i <= N; i++) {
		if (check[i] == false) {
			bfs(i);
			cnt++;
		}
	}
	cout << cnt << endl;
}

int main() {
	solution();
	return 0;
}

'백준 > bfs, dfs' 카테고리의 다른 글

(c++) 백준 9466번: 텀 프로젝트  (0) 2020.06.19
(c++)백준 2331번: 반복수열  (0) 2020.06.19
(c++)백준 10451번: 순열 사이클  (0) 2020.06.19
(c++)백준 1707번: 이분 그래프  (0) 2020.06.19
(c++)백준 1260번: DFS와 BFS  (0) 2020.06.18