luogu3420(POI) 发表于 2017-10-10 | 分类于 luogu POI中的大大大水题,做法很多,最最麻烦的可以tarjan缩点之后判断有多少入度为0的点,简单的话可以直接深搜,反正我是随手敲了一个并查集,因为错误的数据范围WA了一次然后1A。 注意:本题不能只开100000的数组!!! 123456789101112131415161718192021222324252627282930#include<iostream>#include<cstring>#include<cstdio> using namespace std;int fa[1000005];int n;int gef(int x){ if(fa[x]==x)return x; else return fa[x]=gef(fa[x]);}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) fa[i]=i; int x; for(int i=1;i<=n;i++) { scanf("%d",&x); int fx=gef(x); int y=gef(i); if(fx!=y)fa[y]=fx; } int ans=0; for(int i=1;i<=n;i++) if(fa[i]==i)ans++; printf("%d",ans); return 0;}