#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int N=200020;
int n;
int len[N];
vector<int>pre[N];
int e[N],ne[N],h[N],idx;
int rd[N],cd[N];
inline void add(int a,int b)
{
rd[b]++,cd[a]++;
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
inline void dfs(int u,int fa)
{
for(int i=0;i<len[u];i++)
dfs(pre[u][i],u);
add(u,fa);
}
queue<int>q,ans;
int main()
{
memset(h,-1,sizeof h);
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&len[i]);
for(int j=1,x;j<=len[i];j++)
scanf("%d",&x),pre[i].push_back(x);
}
for(int i=0;i<len[1];i++)dfs(pre[1][i],1);
for(int i=1;i<=n;i++)
if(!rd[i]&&cd[i])q.push(i),ans.push(i);
while(q.size())
{
int u=q.front();
q.pop();
for(int i=h[u],j;~i;i=ne[i])
{
j=e[i];
rd[j]--;
if(!rd[j])q.push(j),ans.push(j);
}
}
while(ans.size()>1)
printf("%d ",ans.front()),ans.pop();
putchar('\n');
return 0;
}
我感觉做法思路应该没问题(?)样例和手搓的小数据都过了,但是提交RE了……