https://www.acmicpc.net/problem/2606
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
그래프에서 연결성을 확인하는 문제로, 유니온-파인드 알고리즘으로 풀 수 있다.
유니온 파인드 알고리즘은 재귀적으로 부모 정보를 갱신하고 최상단 부모노드를 리턴하는 파인드 함수와 부모가 다를 시 한 노드가 다른 한 노드의 부모가 되도록하는 유니온 함수로 이루어져 있다.
#include <iostream>
using namespace std;
int parent[101];
//파인드
int ffind(int x) {
//parent[x] == x일 시 부모가 없으므로 자기 자신 리턴
if (parent[x] == x) return x;
//아닐 시, 재귀적으로 올라가면서 부모 노드를 최상단 부모노드로 갱신 하고 리턴
else return parent[x] = ffind(parent[x]);
}
//유니온
bool funion(int x, int y) {
x = ffind(x);
y = ffind(y);
//x와 y의 최상단 부모가 같지 않을 시 union 수행
if (x != y) {
//노드 번호가 더 작은 쪽이 부모가 되도록 swap
if (x > y) {
int tmp = x;
x = y;
y = tmp;
}
parent[y] = x;
return 1;
}
return 0;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m; cin >> n >> m;
int a, b;
int cnt = 0;
//parent 배열을 자기 자신의 idx값으로 초기화
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
while (m--) {
cin >> a >> b;
funion(a, b);
}
//최상단 부모 노드가 1인 경우 갯수 체크
for (int i = 1; i <= n; i++) {
if (ffind(i) == 1) cnt++;
}
cout << cnt - 1;
return 0;
}
메모리: 2020 kb | 시간: 0 ms |
'컴퓨터 사이언스 > 1고리즘' 카테고리의 다른 글
백준 1504 : 특정한 최단 경로 (0) | 2021.07.30 |
---|---|
백준 5214 : 환승 (0) | 2021.07.28 |
백준 1654 : 랜선 자르기 (0) | 2021.07.28 |
백준 1436 : 영화감독 숌 (0) | 2021.07.28 |
백준 1018 : 체스판 다시 칠하기 (0) | 2021.07.28 |