코딩뚠뚠

[백준문제풀이] 11724 연결 요소의 개수 본문

알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 11724 연결 요소의 개수

로디네로 2021. 1. 1. 14:47
반응형

 

풀이일시 : 2020-10-10

 

문제 :

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

 

입력 :

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

ex)

6 5

1 2

2 5

5 1

3 4

4 6

 

출력 :

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

ex)

2

 

풀이 :

dfs로 접근하여 한 번의 dfs가 돌면 count를 ++ 하여 세준다. (연결되어있는것은 한번의 dfs에서 방문처리될것이기때문.)

 

dbstndi6316.tistory.com/64

 

[기본문제풀이] DFS 깊이우선탐색

풀이일시 : 2020-08-30 ​ DFS : 깊이우선탐색으로 DFS보다 좁고 깊게 탐색해나가며 전체 정점을 탐색하는 방법이다. 주로 stack을 이용한다. 아래그림이 dfs를 한눈에 보여준다고 생각한다 출처 : http://

dbstndi6316.tistory.com

#include <iostream>
#include <queue>
#define MAX 1001
using namespace std;

vector<int> a[MAX];
int visit[MAX];
int count = 0;

void dfs(int x) {
	if (visit[x]) 
       return;
	visit[x] = true;
	for (int i = 0; i < a[x].size(); i++) {
		int z = a[x][i];
		dfs(z);
	}
}

int main() {
	int N, M, u, v;
	cin >> N >> M;
	for (int i = 0; i < M; i++) {
		cin >> u >> v;
		a[u].push_back(v); //간선을 만들어준다.
		a[v].push_back(u);
	}
	int sum = 0;
	for (int i = 1; i <= N; i++) {
		if (!visit[i]) { //모든정점 - 방문되지 않은 정점에 대해 dfs를 실행
			dfs(i);
			sum++; //하나의 연결요소
		}
	}
	cout << sum << endl;
	return 0;
} 
반응형