PS

BOJ 9466 텀 프로젝트 C++

소재훈 2021. 11. 30. 16:16
fill(startNumber, startNumber + n + 1, -1);
fill(countNumber, countNumber + n + 1, 0);​
 

9466번: 텀 프로젝트

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

www.acmicpc.net

시간초과로 를 고민하다가, 어차피 한번 방문한 노드는 다시 방문하지 않으니

fill(startNumber, startNumber + n + 1, -1);
fill(countNumber, countNumber + n + 1, 0);

부분을 반복문 밖으로 빼 해결하였다.
사이클을 판별할때 출발 노드가 같은것으로 판별하였고,
사이클안에 몇개의 노드가 포함되는지 확인하기 위해서 시작노드로부터 볓개의 노드를 세고 있는 지 카운팅해주었다.
노드가 자기 자신을 가리킬 때는 전체 갯수에서 1을 빼주고, 출발노드가 같아 사이클이 발견되었으나 자기 자신이 아닐 때는 카운트를 빼준것의 + 1만큼 빼주어 답을 구하였다

 

#include <bits/stdc++.h>
using namespace std;
int t;
int n;
bool vis[100003];
int student[100003];
int startNumber[100003];
int countNumber[100003];
int main() {
    cout.sync_with_stdio(0);
    cin.tie(0);

    cin >> t;
    while(t--) {
        cin >> n;
        int ans = n;
        fill(vis, vis + n + 1, false);
        fill(startNumber, startNumber + n + 1, -1);
        fill(countNumber, countNumber + n + 1, 0);
        for(int i = 1; i <= n; i++) {
            cin >> student[i];
        }
        for(int i = 1; i <= n; i++) {
            if(vis[i]) continue;
            queue<int> Q;
            Q.push(i);
            startNumber[i] = i;
            vis[i] = true;
            countNumber[i] = 1;
            while(!Q.empty()) {
                int cur = Q.front(); Q.pop();
                vis[cur] = true;
                int nextStudent = student[cur];
                if(startNumber[nextStudent] == startNumber[cur]) {
                    if(nextStudent == cur) {
                        ans = ans - 1;
                    }
                    else{
                        ans = ans - (countNumber[cur] - countNumber[nextStudent] + 1);
                    }
                    break;
                }
                if(vis[nextStudent]) continue;
                startNumber[nextStudent] = startNumber[cur];
                countNumber[nextStudent] = countNumber[cur] + 1;
                Q.push(nextStudent);
            }
        }
        cout << ans << '\n';
    }

    return 0;
}

'PS' 카테고리의 다른 글

BOJ 13913: 숨바꼭질 4 C++  (0) 2021.11.30
BOJ 6593 상범빌딩 C++  (0) 2021.11.30
BOJ 2146 다리만들기 C++  (0) 2021.11.30