본문 바로가기

BOJ/C++

[BOJ] 9466. 텀 프로젝트

*사이클이 존재함을 알 수 있어야 한다. 

*그와 동시에 팀에 몇명이 포함되는지도 알아야 한다. 

*팀에 속하지 못한 인원이 몇명인가 -> n- (팀에 속한 인원)

*part[] -> 팀원으로 택한 학생의 인덱스 (입력값)

chk[] -> 처음 시작한 학생의 인덱스 (사이클이 존재함을 알아낸다. -> 내가 처음 dfs를 시작했는데 다시 나를 택한 사람이 있다? -> 사이클)

seq[] -> 팀내의 불린 순서 (최종 인원을 알아내기 위해서 depth를 저장한다)

 

2 5 4 5 2

1번 -> 2번 호출 (chk[1] : 1, seq[1] = 0)

2번 -> 5번 호출 (chk[2] : 1, seq[2] = 1)

5번 -> 2번 호출 (chk[5] : 1, seq[5] = 2)

--> 2번이 2번 호출됐을 때 chk[2] != -1 && chk[2] == start 이므로 사이클이 존재. 

 

if (chk[now] != -1 && chk[now] != start)  -> 이미 사이클이 존재함을 알아냈는데 또 반복하지 않도록 한다. 

 

 

7
6
2 3 4 5 6 2
output : 1

5
2 5 4 5 2
output : 3

6
1 3 4 3 2 6
output : 2

13
2 4 5 2 4 1 8 9 10 11 9 10 10
output : 8

10
2 5 7 1 6 8 8 3 5 10
output : 6

10
2 7 10 5 3 3 9 10 6 3
output : 8

6
2 1 1 2 6 3
output : 4

 

'BOJ > C++' 카테고리의 다른 글

[BOJ] 11723. 집합  (0) 2020.03.12
[BOJ] 10972, 10973 다음 순열 / 이전 순열  (0) 2020.03.12
[BOJ] 13911. 집 구하기  (0) 2020.03.11
잃어버린 괄호  (0) 2020.03.09
배달  (0) 2020.03.09