[백준/C++] 9466번 텀 프로젝트
2021. 3. 28. 19:08ㆍ알고리즘/BFS DFS
728x90
반응형
문제: www.acmicpc.net/problem/9466
9466번: 텀 프로젝트
이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을
www.acmicpc.net
문제풀이
이 문제에서 프로젝트 팀이라는 것은 그래프의 사이클을 뜻한다.
사이클에 속하지 못한 노드들의 개수를 구하는 문제이다.
visited 배열을 선언해 0이면 방문하지 않은 노드, -1이면 사이클에 속하는 노드, 0과 -1이 아닌 다른 숫자이면 방문은 했으나 사이클에 속하지 못하는 노드를 뜻한다.
노드 하나하나를 모두 사이클에 속하는지 검사하면 시간 초과로 문제를 틀리게 된다. 때문에 한 번 방문할 때 연결된 노드들을 다시 방문해서는 안된다.
코드
#include <iostream>
#include <queue>
using namespace std;
int visited[100001];
int link[100001];
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
fill(visited, visited+n+1, 0); //다음 테스트케이스를 위해 초기화
for(int i=1; i<=n; i++){
cin>>link[i];
}
for(int i=1; i<=n; i++){
if(visited[i] != 0) continue; //방문한 적이없는 노드만 탐색
int cur = i;
visited[i] = i;
while(true){
cur = link[cur];
if(visited[cur] == i){ //사이클로 인해 같은 i값을 가지고 있다면
while(visited[cur] != -1){ //해당 사이클의 노드들을 모두 -1로 초기화
visited[cur] = -1;
cur = link[cur];
}
break;
}
if(visited[cur] == 0){ //방문한 적 없다면
visited[cur] = i;
continue;
}
else break; //방문했었다면 break
}
}
int result = n;
for(int i=1; i<=n; i++){
if(visited[i] == -1) //-1의 개수만큼 n에서 빼준다.
result--;
}
cout<<result<<"\n";
}
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 7562번 나이트의 이동 (0) | 2021.03.29 |
---|---|
[백준/C++] 2583번 영역 구하기 (0) | 2021.03.28 |
[백준/C++] 7569번 토마토 (0) | 2021.03.27 |
[백준/C++] 1012번 유기농 배추 (0) | 2021.03.27 |
[백준/C++] 4179번 불! (0) | 2021.03.26 |