문제
진영이는 무방향 그래프 탐색 문제를 다음과 같은 방법으로 해결하였다.
int n, edge[1500][1500], check[1500];
void dfs(int st){ int i; check[st] = 1; for (i = 0; i < n; i++){ if (edge[st][i] == 0 || check[i] == 1) continue; dfs(i); } }
하지만 진영이의 컴퓨터는 RAM 용량이 부족하기 때문에 스택 오버플로우가 생겨서 프로그램이 제대로 돌아가지 않았다. 진영이는 추가적인 계산을 통해 K중 이상으로 재귀(dfs 함수를 한 번에 K개 이상 호출)가 이루어질 때 스택 오버플로우가 나온다는 것을 깨달았다. 진영이는 프로그램을 돌려보면서 더 신기한 점을 발견했는데, 처음에 호출하는 dfs 함수의 인수(st) 값에 따라 스택 오버플로우 유무가 달라진다는 것이다. 이에 흥미를 가진 진영이는 스택 오버플로우가 나오는 st 값이 몇 개나 있는지 알아보려고 한다. (단, st는 0 이상 n-1 이하이다) 진영이가 구하려는 값을 대신 구해주는 프로그램을 만들어보자.
입력
첫 번째 줄에는 노드의 수 N과 스택 오버플로우 발생 조건 K가 주어진다. (1 ≤ N, K ≤ 1,500)
두 번째 줄부터 N개의 줄에는 edge 배열의 값이 주어진다.
edge[i][j] = edge[j][i] 이며, edge[i][i] = 0 임이 보장된다. (0 ≤ i, j < N)
입력 시간이 길 수 있으니 gets, fgets, getline 함수를 사용하는 것을 권장한다.
<제약조건>
• 전체 데이터의 50%는 간선의 개수가 15,000개 이하이다.
출력
첫 번째 줄에 스택 오버플로우가 발생하는 st의 개수를 출력한다.
[ 제약조건 ]
전체 데이터의 50%는 간선의 개수가 15,000개 이하이다.
예제
5 5
0 1 1 0 1
1 0 0 1 0
1 0 0 1 0
0 1 1 0 1
1 0 0 1 0
3
힌트
출처
functionx