ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2606] 바이러스
    알고리즘/백준 2019. 5. 13. 03:39

     각각의 노드가 계층적으로 연결이 되어 있는데, 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
Designed by Tistory.