蒟蒻求助,感觉思路没错啊,30pts
查看原帖
蒟蒻求助,感觉思路没错啊,30pts
396016
大K楼主2021/10/22 09:19

rt

思路是从每一个入度为零的点开始删边,如果某个入度为0的点被删去后它的子节点入度也变为0,那么继续删。这个过程递归实现。

感觉这样删去之后剩下的一定只有环了啊,但是交上去只有30pts,下数据发现是200000的调不了,求大佬指出蒟蒻错误Orz

#include<vector>
#include<iostream>
using namespace std;
vector <int> G[200055];
long long ans,n,sum,Ci[500005],Son[500005],p,Fa[500005];
void Del(int G)
{
	Ci[Son[G]]--;
	if(Ci[Son[G]]==0)
	{
		Del(Son[G]);
		sum++;
	}
		
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&p);
		Son[i]=p;
		Fa[p]=i;
		Ci[p]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(Ci[i]==0)
		{
			Del(i);
			sum++;
		}
	}
	//dfs();
	printf("%lld",n-sum);
	return 0;
}
2021/10/22 09:19
加载中...