본문 바로가기
알고리즘/백준

[백준 2606] 바이러스

by RoJae 2019. 5. 13.

 각각의 노드가 계층적으로 연결이 되어 있는데, 1번 컴퓨터와 몇 개의 컴퓨터가 연결되어 있는지

 구하는 문제이다.

 

 ※ 입력이 컴퓨터 순서대로 나오지 않는다. 라는 점 주의할 것 ※


 나는 Union-Find

문제를 풀었다.


   (참고하면 좋은 글)

         >> Union-Find란??? <<



신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

출력

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

예제 입력 1

7
6
1 2
2 3
1 5
5 2
5 6
4 7

예제 출력 1

4



소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<cstdio>
 
int parent[101], ans = 0;
 
int Find(int x) {
    // root인 경우 X를 반환한다.
    if (x == parent[x])
        return x;
    else {
        // 아니면 root를 찾아감
        int p = Find(parent[x]);
        parent[x] = p;
        return p;
    }
}
 
void Union(int x, int y) {
    x = Find(x);                // x의 최상위 부모 
    y = Find(y);                   // y의 최상위 부모 
    
    if (x != y)
        parent[y] = x;           // y의 최상위 부모를 x로 저장한다. 
}
 
int solve(int virus, int n) {        // virus가 존재하는 집합의 원소 갯수 구하기 
    for (int i = 2; i <= n; i++) {
        if (Find(i) == virus)
            ans++;
    }
    return ans;
}
int main(void) {
    int n, m, a, b;
    scanf("%d%d"&n, &m);
 
    // 초기화 
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
    }
    while (m--) {
        scanf("%d%d"&a, &b);
        Union(a, b);
    }
    int root = Find(1);        // 컴퓨터 1번이 해당하는 집합 
    printf("%d", solve(root, n));    // solve
    return 0;
}
cs


※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.


'알고리즘 > 백준' 카테고리의 다른 글

[백준 1927] 최소 힙  (0) 2019.05.13
[백준 11279] 최대 힙  (0) 2019.05.13
[백준 1717] 집합의 표현  (0) 2019.05.12
[백준 3015] 오아시스 재결합  (0) 2019.05.12

댓글