思路:题意是有n个小孩,每天每个小孩都会给书给某一个小孩,依次循环,问每个小孩几天后会得到他自己的书。由于是一个一直传递的过程,实际上最后图的分布是几个环,(自己给自己就是自环),我们只需要维护一个并查集,根节点存他在第几天可以收到自己的书droot,答案就是每个点找自己根节点的值存的dfind(x)
#include<iostream>
using namespace std;
const int N = 210;
int p[N],d[N];
int find(int x) // 并查集
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )p[i]=i,d[i]=1;
for (int i = 1; i <= n; i ++ )
{
int fa;
scanf("%d", &fa);
if(find(fa)!=find(i))
{
d[find(fa)]+=d[find(i)];
p[find(i)]=find(fa);
}
}
for (int i = 1; i <= n; i ++ )printf("%d ",d[find(i)]);
if(T!=0)puts("");
}
return 0;
}