-
[백준 2606] 바이러스알고리즘/백준 2019. 5. 13. 03:39
각각의 노드가 계층적으로 연결이 되어 있는데, 1번 컴퓨터와 몇 개의 컴퓨터가 연결되어 있는지
구하는 문제이다.
※ 입력이 컴퓨터 순서대로 나오지 않는다. 라는 점 주의할 것 ※
나는 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
소스코드
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#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)); // solvereturn 0;}cs ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.
반응형'알고리즘 > 백준' 카테고리의 다른 글
[백준 1927] 최소 힙 (0) 2019.05.13 [백준 11279] 최대 힙 (0) 2019.05.13 [백준 1717] 집합의 표현 (0) 2019.05.12 [백준 3015] 오아시스 재결합 (0) 2019.05.12