union-find , graph 문제이다.
union-find로 풀 경우, 들어오는 대로 union하여 그룹을 만든후, 그룹의 수를 세면 된다.
graph로 풀 경우, 양방향 그래프를 만들어 준 후, dfs 탐색 하여 그룹의 수를 확인한다.
여기 코드는 graph로 풀은 경우이다.
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
bool visited[101];
void DFS(vector<vector<int>> G, int index)
{
visited[index] = true;
for (int i = 0; i < G[index].size(); i++)
if (!visited[G[index][i]])
DFS(G, G[index][i]);
}
int main(int argc, char** argv)
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
memset(visited, false, sizeof(visited));
int N, M; cin >> N >> M;
vector<vector<int>> GRAPH(N + 1, vector<int>());
int start, end, out = 0;
for (int i = 0; i < M; i++)
{
cin >> start >> end;
GRAPH[start].push_back(end);
GRAPH[end].push_back(start);
}
for(int i = 1; i <= N; i++)
if (!visited[i])
{
out++;
DFS(GRAPH, i);
}
cout << '#' << test_case << ' ' << out << '\n';
}
return 0;
}
'Coding_Test 연습 > SWEA' 카테고리의 다른 글
[SWEA] (C++) D4 4050 재관이의 대량 할인 (0) | 2022.04.26 |
---|---|
[SWEA] (C++) D4 5987 달리기 (0) | 2022.04.26 |
[SWEA] (C++) D4 8501 은비의 동전 뒤집기 (0) | 2022.04.25 |
[SWEA] (C++) D4 4261 빠른 휴대전화 키패드 (0) | 2022.04.25 |
[SWEA] (C++) D4 1861 정사각형 방 (0) | 2022.04.25 |