dfs方法
#include<bits/stdc++.h>
typedef unsigned long long ull;
typedef long long ll;
using namespace std;
const int N = 1e4 + 10;
const int M = 2e5 + 10;
const int mod = 1e9 + 7;
vector<vector<int>> a(N); //保存树
vector<int> ans; //记录最长路径
vector<int> tmp; //记录dfs过程中路径
void dfs(int now){ //dfs遍历
tmp.push_back(now); //把当前节点保存到tmp
sort(a[now].begin(),a[now].end()); //对当前节点的子节点进行排序,保证路径字典序最小
for (auto &j : a[now]) { //继续dfs当前节点的子节点
dfs(j);
if(tmp.size() > ans.size()){ //如果tmp的长度大于ans,就更新ans
ans.clear();
ans = tmp;
}
tmp.pop_back(); //当前节点遍历完成,注意回溯,把路径上的当前节点弹出
}
}
void solve(){
int n;
cin>>n;
map<int,int> mp;
for (int i = 0; i < n; ++i) {
int k;
cin>>k;
for (int j = 1; j <= k; ++j) {
int x;
cin>>x;
mp[x]++;
a[i].push_back(x); //建树,由于结果只会是一条路走到头,所以只建单向边即可
}
}
int st = 0; //保存开始节点
for (int i = 0; i <= n-1; ++i) {
if(mp[i] == 0){ //哪个节点没出现在变异株中就是开始节点
st = i;
break;
}
}
dfs(st);//注意病毒源头不一定是0
if(n==1){ //特判
cout<<1<<endl<<0;
return;
}
cout<<ans.size()<<endl;
for (int i = 0; i < ans.size(); ++i) { //输出即可
cout<<ans[i];
if(i != ans.size() - 1){
cout<<" ";
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
int t = 1;
//cin>>t;
while(t--){
solve();//1 2 3 4 5
}
return 0 ;
}