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
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int n, m, cnt = 0;
// 방문 여부에 대한 배열
array<bool, 1001> arr;
// 노드들 간의 연결 상태를 보여주는 2차원 벡터
vector<vector<int>> v(1001);
// 노드 방문 시
void check(int i)
{
// 이미 방문했던 노드면 바로 종료
if(arr[i]) return;
// 방문했다고 표시해주고
arr[i] = true;
// 자기에게 연결되어있는 노드들을 전부 방문
for(int j = 0 ; j < v[i].size() ; j++)
{
check(v[i][j]);
}
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
int l,r;
// 입력받은 데이터를 가지고 노드들을 서로 연결
for(int i = 0 ; i < m ; i++)
{
cin >> l >> r;
v[l].emplace_back(r);
v[r].emplace_back(l);
}
// 노드들을 전부 방문
for(int i = 1 ; i <= n ; i++)
{
// 이미 방문했던 노드라면 다른 곳에 연결되어있다는 뜻
if(arr[i])
{
continue;
}
// 방문하지 않은 노드 - 새로운 연결 요소 라는 뜻
check(i);
cnt++;
}
cout << cnt << '\n';
}
[Try]
1. DFS 를 활용하여 방문노드들을 전부 처리해주고, 1~n 까지 반복하면서 방문하지 않았던 노드의 갯수를 세주면 될 것 같다.
[Point]
1. 많은 사람들과 비슷하게 풀어냈다. 푸는데 10분? 정도밖에 걸리지 않은데다가 1트만에 해결돼서 굉장히 기분이 좋다.
[More]
1. 재귀가 아닌 스택을 이용해서 DFS 만들어 볼 것
2. BFS 로도 만들어보기
3. 분리 집합
'PS > BOJ' 카테고리의 다른 글
[백준] 11727.cpp : 2 x n 타일링 2 (0) | 2020.05.27 |
---|---|
[백준] 1931.cpp : 회의실배정 (0) | 2020.05.27 |
[백준] 1620.cpp : 나는야 포켓몬 마스터 이다솜 (0) | 2020.05.27 |
[백준] 11726.cpp : 2 x n 타일링 (0) | 2020.05.26 |
[백준] 4948.cpp : 베르트랑 공준 (0) | 2020.05.26 |