- 문제 링크 : boj.kr/11724
- 난이도 : S2
- 태그 : 그래프, BFS, DFS
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 <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
vector<bool> visit(n+1);
vector<vector<int>> e(n+1);
for(int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
int ans = 0;
for(int i = 1; i <= n; i++) {
if(visit[i]) continue;
ans++;
queue<int> _q;
_q.push(i);
visit[i] = true;
while(!_q.empty()) {
int curr = _q.front(); _q.pop();
for(auto u : e[curr]) {
if(visit[u]) continue;
_q.push(u);
visit[u] = true;
}
}
}
cout << ans;
return 0;
}
풀이
문제에서 연결 요소가 뭔지 알려주지 않아 접근에 어려움이 있다.
연결 요소란 간선으로 연결되어 있는 정점들의 집합을 말한다.
연결 요소의 수를 구해보자.
어떤 정점에서 탐색을 시작한다면, 그 정점과 같은 연결 요소에 속한 정점들은 탐색이 완료된다.
이미 탐색이 완료된 정점이라면 지금까지 찾은 연결 요소에 속해있었다고도 할 수 있다.
따라서 정점을 순회하며 아직 탐색하지 않은 정점이라면 그 정점을 출발지로 하여 탐색을 진행하고, 그 횟수를 세어 연결 요소의 개수를 구할 수 있다.
탐색은 DFS와 BFS중 편한 것을 골라 사용하면 된다.
728x90
'PS' 카테고리의 다른 글
BOJ 10845 : 큐 (0) | 2024.02.15 |
---|---|
BOJ 1051 : 숫자 정사각형 (0) | 2024.02.14 |
BOJ 5052 : 전화번호 목록 (1) | 2024.02.12 |
BOJ 20044 : Project Teams (0) | 2024.02.11 |
BOJ 20920 : 영단어 암기는 괴로워 (1) | 2024.02.10 |