https://www.acmicpc.net/problem/2606
주어진 예제를 그래프로 표현하면 아래 그림과 같다.
1번 컴퓨터에 어떻게든 연결된 컴퓨터는 감염된다.
우선 네트워크를 표현하기 위해 이차원 배열을 할당하고 두 노드 사이에 간선이 있으면 TRUE를 저장한다.
1번 노드에서 1~n번 노드 중 간선이 있는 경우 그 노드를 방문한다.
방문한 노드가 i번 노드일 때 해당 노드에 감염 여부를 TRUE로 바꿔준다.
i번 노드에서 1~n번 노드 중 간선이 있을 때 그 노드를 방문한다.
이미 감염된 경우 빠져나온다.
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 48 | #include<stdio.h> #define TRUE 1 #define FALSE 0 void visitNet(int **net, int *infection, int n, int start) { if (infection[start]) return; infection[start] = TRUE; for (int end = 0; end < n; end++) { if (net[start][end]) { visitNet(net, infection, n, end); } } } int main() { int n, conn; int **net; int *infection; int start, end; int count = 0; scanf("%d %d",&n,&conn); net = (int **)malloc(sizeof(int *)*n); for (int i = 0; i < n;i++) { net[i] = (int *)calloc(n,sizeof(int)); } infection = (int **)calloc(n, sizeof(int)); for (int i = 0; i < conn;i++) { scanf("%d %d",&start, &end); start--, end--; net[start][end] = TRUE; net[end][start] = TRUE; } visitNet(net,infection,n,0); for (int j = 0; j < n; j++) { count += infection[j]; } printf("%d\n",count-1); return 0; } | cs |
'백준' 카테고리의 다른 글
2578)빙고 (0) | 2019.02.13 |
---|---|
2607)비슷한 단어 (0) | 2019.02.12 |
2605)줄 세우기 (0) | 2019.02.11 |
2309)일곱난쟁이 (0) | 2019.02.11 |
2217)로프 (0) | 2019.02.11 |