본문 바로가기

Algorithm/BOJ

[BOJ] 9466 텀 프로젝트

cycle의 개수를 세야하는 문제였다. 이전에도 알고리즘 조교하면서 구현을 제대로 못했었는데 이번에도 어렵게 코드를 이해했다. 

 

 

9466번: 텀 프로젝트

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

www.acmicpc.net

이전에 확인한 cycle 관련코드도 지금 다시 보니 어질어질하다.

frieden1946.tistory.com/334

 

 

 

#include <iostream>

#include <cstring> //memset

using namespace std;



const int MAX = 100000 + 1;



int N, cnt;

int want[MAX];

bool visited[MAX];

bool done[MAX]; //방문이 끝났는지 여부



void DFS(int nodeNum)

{
    //cout << nodeNum<<" , ";

    visited[nodeNum] = true;
    int next = want[nodeNum];
    if (!visited[next])
        DFS(next);
        //이미 방문했지만 방문이 끝난 노드가 아니라면 사이클
    else if (!done[next])
    {
        //팀원을 모두 센다
        for (int i = next; i != nodeNum; i = want[i])
            cnt++;
        cnt++; //자기 자신을 센다
    }
    done[nodeNum] = true; //더 이상 해당 노드를 방문할 일이 없다
}

int main(void)

{

    int T;
    cin >> T;
    for (int i = 0; i < T; i++)

    {
        memset(visited, false, sizeof(visited));

        memset(done, false, sizeof(done));

        cin >> N;
        for (int j = 1; j <= N; j++)

            cin >> want[j];

        cnt = 0;

        for (int j = 1; j <= N; j++){
            if (!visited[j]){
                DFS(j); //팀을 이루는 사람들을 센다
                //cout << endl;

            }


        }




        cout << N - cnt << endl;

    }

    return 0;

}



 

아직 내가 돌고 있는 그래프 내에서 끝나지 않았다면 done은 false로 표시되어 있다. 내가 돌고 있는 그래프에서 cycle이 있는지 모두 확인했다면 done은 재귀를 끝내면서 true로 바뀌게 된다. 그러면 이 그래프에 대해서는 다시 들어가지 않는다.

 

1) next, visit x

    dfs(next)

 

2) next, visit o, done x

   cycle이니까 개수 세라

 

이거 다 끝나면 done으로 다 바꿔라

 

 

백준 9466번 텀 프로젝트

문제 링크입니다: https://www.acmicpc.net/problem/9466 DFS(Depth First Search) 알고리즘을 사용하여 사이클을 이루지 않는 사람의 수를 구하는 문제였습니다. visited 배열은 기존에 풀었던 DFS 문제들에서도..

jaimemin.tistory.com

 

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

[BOJ] 1525 퍼즐  (0) 2021.04.03
[BOJ] 2261 가장 가까운 두 점  (0) 2021.03.24
[BOJ] 2331 반복수열  (0) 2021.03.01
[BOJ] 2110 공유기 설치  (0) 2021.03.01
[BOJ] 1707 이분 그래프  (0) 2021.02.26