Algorithm/Baekjoon_PS

9466_텀프로젝트 (DFS)

kahuz 2020. 8. 5. 02:24

본 포스팅은 문제에 대한 접근에 문제가 없지만 코드를 구현함에 있어서 어려운 분들에게 도움이 되었으면 하고자하여 작성하게 되었습니다.

 

9466_텀프로젝트

 - 이 문제는 DFS를 활용하여 사이클을 찾는 문제이다

 - 입력된 순서와 학생 정보를 토대로 노드의 연결관계가 주어지고, 이를 통해 사이클을 찾은 뒤 사이클에서 제외된 학생을 수를 구하는 문제이다. 문제의 요점은 "총 학생의 수에서 제외된 학생의 수"를 구하는 것이다.

 - 문제 풀이는 DFS를 이용하여 해결했다.

 - 자세한 내용은 코드의 주석을 참고하자.

 

#include <iostream> //io
#include <cstring> //memset
using namespace std;
//테스트 케이스와 노드의 수를 저장할 변수 선언 및 초기화
int T = 0, N = 0;
//결과값을 저장할 변수 선언, 초기화는 테스트 루프에서 진행
int res;
//인전행렬 선언 및 초기화
int arr[100001] = { 0 };
//각 노드(배열의 인덱스)의 방문 정보를 저장할 배열 선언, 원소는 탐색시 몇번째로 방문했는지를 저장
int check[100001] = { 0 };
//각 노드(배열의 인덱스)의 탐색시 탐색 첫번째 노드를 저장할 배열 선언 및 초기화
int start_nodes[100001] = { 0 };
//param start : 탐색 시작 노드
//param cur : 현재 방문한 노드
//param depth : 현재 노드까지 방문한 깊이, 만약 사이클이 시작 노드 ~ 현재 노드까지라면
//모든 노드가 사이클을 이루고 있으므로 사이클에 포함된 노드수 - depth = start_nodes[cur]이 1이므로 사이클에 포함된 노드수가 된다
//만약 사이클이 시작 이후의 노드 ~ 현재 노드라면 사이클에 포함된 노드수 - depth = "경로상 사이클의 제외된 노드 수" 가 된다
int dfs(int start, int cur, int depth)
{
//이미 현재 노드에 방문했다면
if (check[cur] > 0)
{
//시작 노드로 사이클이 진행되지 않고 방문했다면
//이미 사이클을 이룬 노드에 접근하는 것이므로
//현재 노드는 사이클이 아니다
if (start_nodes[cur] != start)
return 0;
//사이클에 포함된 노드 수
return depth - check[cur];
}
//현재 노드의 탐색 시작 노드를 저장
start_nodes[cur] = start;
//탐색경로 상 현재 노드에 몇번째로 방문했는지 저장
check[cur] = depth;
//다음 탐색으로 진입
return dfs(start, arr[cur], depth + 1);
}
int main(void)
{
//cpp iostream 가속을 위한 c lib 동기화 제거
ios_base::sync_with_stdio(false);
//테스트 케이스 수를 입력받는다
cin >> T;
//테스트 케이스 수만큼 루프
while (T--)
{
//테스트 케이스 별 결과값 저장을 위한 초기화
res = 0;
//노드의 수를 입력받는다
cin >> N;
//각 노드별 간선 정보를 입력받는다
for (int i = 1; i <= N; i++)
cin >> arr[i];
//각 노드별 탐색 진행
for (int i = 1; i <= N; i++)
{
//check[i] == false, i노드를 아직 탐색하지 않았다면
if (!check[i])
{
//dfs 탐색 후 사이클에 해당하는 노드의 수를 리턴
res += dfs(i, i, 1);
}
}
//결과값 출력
cout << N - res << endl;
//사용된 배열 초기화, arr은 입력시 초기화되므로 제외
memset(check, 0, sizeof(check));
memset(start_nodes, 0, sizeof(start_nodes));
}
return 0;
}

 

 

'Algorithm > Baekjoon_PS' 카테고리의 다른 글

2210_숫자판점프 (DFS)  (0) 2020.08.05
9663_N-Queen (DFS)  (0) 2020.08.05
11725_트리의 부모찾기 (DFS)  (0) 2020.08.05
10451_순열사이클 (BFS)  (0) 2020.08.05
4963_섬의개수 (BFS)  (0) 2020.08.05