并查集求dalao调
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline void LOG(string s,int n)
{
cout<<s<<'='<<n<<'\n';
}
inline void LOG(string s,char c)
{
cout<<s<<'='<<c<<'\n';
}
inline void LOG(string s,bool b)
{
if(b)
cout<<s<<"=true"<<'\n';
else
cout<<s<<"=false"<<'\n';
}
inline void LOG(string s,double b)
{
cout<<s<<'='<<b<<'\n';
}
int f[210];
bool g[210][210];
int n,ans=0;
int fi(int k)
{
if(f[k]!=k)
f[k]=fi(f[k]);
return f[k];
}
void un(int a,int b)
{
f[b]=a;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t,k,i,j;
cin>>n;
for(i=1;i<=n;i++)
{
f[i]=i;
while(1)
{
cin>>t;
if(t==0)
break;
g[i][t]=1;
}
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(g[i][j])
un(i,j);
for(i=1;i<=n;i++)
cout<<fi(i)<<' ';
cout<<endl<<endl;
for(i=1;i<=n;i++)
if(f[i]==i)
ans++;
cout<<ans;
return 0;
}