DAMPER's blog

9466 텀 프로젝트 본문

Problem Solving/BOJ 문제풀이

9466 텀 프로젝트

DAMPER 2021. 5. 14. 15:28
728x90

https://www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

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

www.acmicpc.net

 

한 학생당 한 명만 지목할 수 있으므로 단조로운 형태의 그래프가 형성된다.

위 표를 그래프로 그려보면 다음과 같다.

 

이 때, 사이클을 형성하는 그룹({3}, {4, 6, 7})만 팀에 속하고, 나머지는 팀에 속하지 못한다.

 

dfs로 해당 루트에 group number를 부여해 이미 왔던 곳인데 group number가 같다면 사이클이 형성된 것이므로 해당 갯수만큼 모두 합하여 전체 노드 갯수에서 빼면 문제를 해결할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std;
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
typedef long long lld;
 
int target;
bool flag;
 
int dfs(int pos, int gn, vector<int>& select, vector<int>& visit)
{
    visit[pos] = gn;
    if(pos == select[pos]) return 1;
    if(visit[select[pos]] == gn)
    {
        target = select[pos];
        flag = true;
        return 1;
    }
    else if(visit[select[pos]] > 0return 0;
    int ret = dfs(select[pos], gn, select, visit);    
    if(flag) ret++;
    if(target == pos) flag = false;
    return ret;
}
 
int main()
{
    cin.sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int tc;
    cin >> tc;
    while(tc--)
    {
        int n;
        cin >> n;
        vector<int> visit(n+10), select(n+10);
        for(int i=1;i<=n;i++)
            cin >> select[i];
        int gn = 1, ans = 0;
        for(int i=1;i<=n;i++)
        {
            if(visit[i]) continue;
            ans += dfs(i, gn++, select, visit);
            flag = false;
        }
        cout << n-ans << endl;
    }
    return 0;
}
cs
728x90

'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글

9328 열쇠  (0) 2021.08.17
2473 세 용액  (0) 2021.08.17
1655 가운데를 말해요  (0) 2021.05.14
11404 플로이드  (0) 2021.05.14
11660 구간 합 구하기 5  (0) 2021.05.14