俺寻思就是个判环
害,并查集可以写的,vector也挺简单的
【老天鹅啊。。还有好多题解没补,wsl】
vector:
#include<bits/stdc++.h>
#include <vector>
typedef long long ll;
using namespace std;
ll a[200100];
ll vis[200100];
ll ans[200100];
int main()
{
ll N;
scanf("%lld",&N);
while(N--)
{
vector <ll > v1;
ll n;
scanf("%lld",&n);
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);a[i]--;
vis[i]=0;
}
ll now=0;
ll x=0;
for(ll i=0;i<n;i++)
{
if(vis[i]==1)continue;
v1.clear();
now=i;
while(vis[now]==0)
{
v1.push_back(now);
//x++;
vis[now]=1;
now=a[now];
}
for(auto now:v1)
{
ans[now]=v1.size();
}
}
for(ll i=0;i<n;i++)
{
printf("%lld ",ans[i]);
}
printf("\n");
}
return 0;
}
注意memset必须在for里面初始化,直接memset会T噢
dfs:
const int manx=300010;
ll temp;
ll haha[manx];
ll sum[manx];
ll flag[manx];
void dfs(ll i, ll net)
{
temp++;
if(flag[i])
return ;
else
{
flag[i]=1;
dfs(net,haha[net]);
}
sum[i]=temp;
}
int main()
{
ll T;
scanf("%lld",&T);
while(T--)
{
ll n;
scanf("%lld",&n);
for(ll i =1; i<=n; i++)
{
scanf("%lld",&haha[i]);
sum[i]=0;
flag[i]=0;
}
for(ll i=1; i<=n; i++)
{
if(!sum[i])
{
temp=0;
dfs(i,haha[i]);
}
}
for(ll i=1; i<=n; i++)
printf("%lld ",sum[i]-1);
printf("\n");
}
return 0;
}