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++;
}
}
printf("%lld",n-sum);
return 0;
}