链接: link.
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
vector<vector<int> > g;//存下病毒关系
vector<int> ans,tmp;//存变异链
bool vis[N];//标记数组,用于查找根病毒
int n,k,cnt;
void DFS(int u,int sum)
{
if(sum>cnt)//如果sum大于上一次的cnt值我们就进行替换
{
ans = tmp;
cnt = sum;
}
else if(sum==cnt&&tmp<ans)//sum==cnt时,由于题目要求输出最小序列,所以我们也要进行判断交换
{
ans = tmp;
}
for(int i=0;i<g[u].size();i++)
{
int v = g[u][i];
tmp.push_back(v);
DFS(v,sum+1);
tmp.pop_back();//回溯
}
}
int main()
{
cin>>n;
g.resize(n+1);//申请空间
for(int i=0;i<n;i++)
{
cin>>k;
while(k--)
{
int x;
cin>>x;
vis[x] = true;
g[i].push_back(x);
}
}
int root = 0;
while(vis[root]) root++;//找到根病毒
DFS(root,1);
cout<<cnt<<endl;
cout<<root;
for(int i=0;i<ans.size();i++)
cout<<' '<<ans[i];
return 0;
}