团伙首领 - 算法题解:计算小团体数目
团伙首领 - 算法题解:计算小团体数目
题目描述
某 E 正在机房值班,小朋友吵得她头晕脑胀,她将 $N$ 名吵闹的小朋友带出了机房,依次编号为 $1,2,\cdots,N$。
某 E 发现,这些小朋友形成了若干个小团伙,每个小朋友属于且只属于一个小团伙。她要求每一名小朋友指出自己所在小团伙的首领编号,第 $i$ 名小朋友指认的首领编号为 $S_i$。
假定所有小朋友都没有说谎,请问这 $N$ 名小朋友中一共形成了多少个小团伙?
输入格式
输入共两行。
输入的第一行为一个正整数 $N$。
输入的第二行为 $N$ 个正整数,第 $i$ 个为 $S_i$。
输出格式
输出一行一个整数,代表机房里小团体的数目。
样例 #1
样例输入 #1
5
1 1 3 4 1
样例输出 #1
3
提示
数据规模与约定
- 对于 $30%$ 的测试数据,每个小团体有且只有一个人。
- 对于 $100%$ 的测试数据,$N \le10^6$,$1 \leq S_i \leq N$。数据保证有解且合法,即每个小朋友都真实地指认了 ta 所在团伙的首领。cpp code内容:```cpp
#include
#include #include <unordered_set>
using namespace std;
int main() { int N; cin >> N;
vector<int> S(N);
for (int i = 0; i < N; i++) {
cin >> S[i];
}
unordered_set<int> leaders;
for (int i = 0; i < N; i++) {
if (S[i] == i+1) {
leaders.insert(i+1);
}
}
cout << leaders.size() << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/pNiN 著作权归作者所有。请勿转载和采集!