团伙首领 - 算法题解:计算小团体数目

题目描述

某 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录