题解 P3420 【[POI2005]SKA-Piggy Banks】

oscar

2017-09-09 14:09:36

Solution

【POI补全计划#4 POI2005 SKA】 楼下好多人都说要用并查集,实际上是想复杂了 看到“每个(储钱罐)的钥匙在另**一个**(储钱罐)里面”就应该想到这是多棵环套树(证明见IOI2008 Island的题解) 所以只需要DFS一遍,数一下有多少个环就好了(显然其它点一定能从环上到达) **数组开100000不够** 其它没什么好说的了,上代码 ```cpp #include<iostream> #include<cstdio> using namespace std; const int MAXN=1000010; int vis[MAXN],pa[MAXN]; int n,ans; inline void dfs(int x,int type) { if(type==1) { if(vis[x]==1) { ++ans; return; } else if(vis[x]==2)return; } else { if(vis[x]==2)return; } vis[x]=type; dfs(pa[x],type); } int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&pa[i]); } for(int i=1;i<=n;++i) { if(!vis[i]) { dfs(i,1); dfs(i,2); } } printf("%d",ans); return 0; } ```