BOJ 11724. 연결 요소의 개수
🙇♀️[Silver II] 연결 요소의 개수 - 11724
성능 요약
메모리: 6000 KB, 시간: 88 ms
분류
그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색
제출 일자
2023년 12월 17일 16:51:14
문제 설명
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
</br>
🚀풀이
연결 요소가 뭔지 몰라서 찾아봤다.
그래프 중에서 따로 따로 연결된 것들의 개수를 말한다.
문제를 해결하기 위해서 모든 정점을 순회를 해야한다.
순회를 할 때 이미 bfs를 통해서 순회했다면 순회를 하지 않아도 된다.
이걸 생각해서 코드를 짰는데, 그냥 bfs를 몇 번 순회하는지 알면 되는 문제였다.
int n, m, res = 0;
// 행렬을 만들어야 됨
vector<vector<int>> matrix;
vector<bool> discovered;
void setting()
{
cin >> n >> m;
matrix = vector<vector<int>>(n + 1, vector<int>(n + 1, -1));
discovered = vector<bool>(n + 1, false);
visited = vector<bool>(n + 1, false);
int u, v;
// 인접 행렬로 그래프를 만들었다.
for (int i = 0; i < m; ++i)
{
cin >> u >> v;
matrix[u][v] = 1;
matrix[v][u] = 1;
}
}
void bfs(int here)
{
queue<int> q;
q.push(here);
discovered[here] = true;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int there = 1; there <= n; ++there)
{
if (matrix[here][there] == -1)
continue;
if (discovered[there])
continue;
q.push(there);
discovered[there] = true;
}
}
res++;
}
void solve()
{
for (int i = 1; i <= n; ++i)
{
// 모든 정점을 순회를 한다.
// bfs를 돌면 연결된 모든 정점들은 순회를 할 테니 bfs를 할때마다 res를 증가하면 된다.
if (discovered[i] == false)
{
bfs(i);
}
}
cout << res;
}
🚀전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int n, m, res = 0;
// 행렬을 만들어야 됨
vector<vector<int>> matrix;
vector<bool> discovered;
vector<bool> visited;
void setting()
{
cin >> n >> m;
matrix = vector<vector<int>>(n + 1, vector<int>(n + 1, -1));
discovered = vector<bool>(n + 1, false);
visited = vector<bool>(n + 1, false);
int u, v;
for (int i = 0; i < m; ++i)
{
cin >> u >> v;
matrix[u][v] = 1;
matrix[v][u] = 1;
}
}
void bfs(int here)
{
queue<int> q;
q.push(here);
discovered[here] = true;
while (q.empty() == false)
{
here = q.front();
q.pop();
visited[here] = true;
for (int there = 1; there <= n; ++there)
{
if (matrix[here][there] == -1)
continue;
if (discovered[there])
continue;
q.push(there);
discovered[there] = true;
}
}
res++;
}
void solve()
{
for (int i = 1; i <= n; ++i)
{
if (discovered[i] == false)
{
bfs(i);
}
}
cout << res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}