一个罐子的钥匙只可能在一个罐子里面(有可能是自己),打开了那个罐子就可以打开这个罐子,说明每个点的入度都为1。
那么对于一个连通块,只有这一种情况:
一开始在一个环里(有可能是自环),环上引出一条链,那么随便打碎一个环上的罐子,就可以打开其他的罐子。
那么答案就相当于连通块的个数了。
用并查集搞一搞就好了。
/* Footprints In The Blood Soaked Snow */
#include <cstdio>
using namespace std;
const int maxn = 1000005;
int n, fa[maxn];
inline int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = 1; i <= n; i++) {
int x; scanf("%d", &x);
int a = find(i), b = find(x);
if(a != b) fa[a] = b;
}
int ans = 0;
for(int i = 1; i <= n; i++) if(fa[i] == i) ans++;
printf("%d\n", ans);
return 0;
}