CF755C题解
修改日志
-
2022.8.4:对算法进一步描述。
-
2022.8.5:更改 的写法,将 AC 的 去处。
思路
这题,只需要将输入的数据建成无向图就好了。
对于每个未访问的点,将 ,然后遍历一遍他的儿子。
如果儿子节点已经访问过了,那直接通过。
否则,将儿子节点标记为已访问,然后遍历儿子的儿子节点。
最终输出 即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,num,f[20010],nxt[20010],to[20010],ans;
bool b[10010];
void dfs(int u){
b[u]=1;
for(int i=f[u];i;i=nxt[i]){
if(b[to[i]]){
continue;
}
dfs(to[i]);
}
}
void add(int a,int b){
to[++num]=b;
nxt[num]=f[a];
f[a]=num;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int fa;
cin>>fa;
add(fa,i);
}
for(int i=1;i<=n;i++){
if(!b[i]){
ans++;
dfs(i);
}
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号