티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

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

www.acmicpc.net

 

풀이

방향성 있는 그래프가 만들어집니다.

1) indgree가 0인 모든 배열을 큐에 넣어줍니다.

2) 위상 정렬을 돌립니다.

3) 어떤 팀에 속한다는 말은 곧 그래프에서 사이클을 이룬다는 말과 같습니다.

위상 정렬이 끝난 뒤 방문하지 못한 정점이 있다면, 그 정점은 사이클을 이룬다는 뜻입니다.

 

그러므로 위상 정렬 과정 중 방문한 정점의 개수를 출력해주면 됩니다.

 

 

정답 코드

#include <bits/stdc++.h>

using namespace std;

int p[111'111], indeg[111'111];
int n;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        cin >> n;
        memset(indeg, 0, sizeof(indeg));
        for (int i = 1; i < n + 1; i++) {
            cin >> p[i];
            indeg[p[i]]++;
        }
        queue<int> q;
        for (int i = 1; i < n + 1; i++) {
            if (indeg[i] == 0) q.push(i);
        }
        int ans = 0;
        while (!q.empty()) {
            int now = q.front();
            q.pop();
            ans++;
            int next = p[now];
            if (--indeg[next] == 0)q.push(next);
        }
        cout << ans << '\n';
    }
}

 

728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 10775 공항  (0) 2021.03.09
[BOJ] 백준 9527 1의 개수 세기  (5) 2021.03.09
[BOJ] 백준 9328 열쇠  (0) 2021.03.08
[BOJ] 백준 7579 앱  (1) 2021.03.08
[BOJ] 백준 7453 합이 0인 네 정수  (0) 2021.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함