CF755C题解

修改日志

  • 2022.8.4:对算法进一步描述。

  • 2022.8.5:更改 LaTeX\LaTeX 的写法,将 AC 的 LaTeX\LaTeX 去处。

思路

这题,只需要将输入的数据建成无向图就好了。

对于每个未访问的点,将 ans+1ans+1,然后遍历一遍他的儿子。

如果儿子节点已经访问过了,那直接通过。

否则,将儿子节点标记为已访问,然后遍历儿子的儿子节点。

最终输出 ansans 即可。

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;
}
posted @ 2022-07-31 16:43  fengxiaoyi  阅读(40)  评论(0)    收藏  举报  来源