PS
BOJ 11724 : 연결 요소의 개수
lickelon
2024. 2. 13. 16:47
- 문제 링크 : 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