본문 바로가기
Algorithm/그래프, 트리

사이클 크기 구하기 (텀 프로젝트)

by KurkurJae 2021. 3. 10.
반응형

www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을

www.acmicpc.net

 

DFS(Depth First Search) 알고리즘을 사용하여 사이클을 이루지 않는 사람의 수를 구하는 문제.

기존의 vist 배열과 함께, 해당원소 탐색이 완료되었다는 done 배열을 이용하여 사이클 크기를 구하는문제.

 

#include <iostream>

using namespace std;
int point[100001];
bool vist[100001];
bool done[100001];
int TC , N , sum ;
void DFS(int Num ){
    vist[Num] = true;
    int next = point[Num];
    if(! vist[next] ) {
        DFS(next);
    }
    else{
        if(! done[next] ){ // = if(vist[next] == true  && !done[next])
            int cnt = 1;
            int n = point[Num]; // 현재 검사하고 있는 위치의 사이클 크기  
            while (true){
                if(n == Num) break;
                n = point[n];
                cnt ++ ;
            }
            sum += cnt;
        }
    }
    done[Num] = true; 
}
void init(){
    sum = 0;
    for(int i = 1 ; i <= N ;i++){
        vist[i] = false;
        done[i] = false;
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> TC;
   
    for(int tc = 0; tc < TC; tc++){
        cin >> N;
        init();
        for(int i = 1; i <= N ; i++){
            cin >> point[i];
        }
        for(int i = 1; i <= N ; i++){
            if(vist[i] == false) DFS(i);
        }
        cout << N - sum <<endl;
    }
    return 0;
}
반응형

'Algorithm > 그래프, 트리' 카테고리의 다른 글

트리의 순회  (0) 2021.03.30
트리의 지름  (0) 2021.03.11
이분 그래프 (Bipartite Graph)  (0) 2021.03.06
위상정렬  (0) 2021.02.26
신장트리, 크루스칼 알고리즘  (0) 2021.02.26

댓글