티스토리 뷰
728x90
문제 링크
풀이
방향성 있는 그래프가 만들어집니다.
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 |
댓글