각각의 노드가 계층적으로 연결이 되어 있는데, 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
소스코드
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 |
댓글