多叉树的遍历
类似的题目:L2-031 深入虎穴 (25 分)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5;
vector<int> v[N],temp,ans;
int fg[N];
int n,root;
//cur为当前节点
void dfs(int cur){
if(temp.size() > ans.size()){
//如果当前序列长度大于上一次序列长度就更新
ans = temp;
}
for(int i=0;i<v[cur].size();i++){
int u = v[cur][i];
temp.push_back(u);
dfs(u);
temp.pop_back();
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int t;
cin>>t;
while(t--){
int num;
cin>>num;
fg[num] = 1;
v[i].push_back(num);
}
//排序 排序后只需要记录最长的序列即可
sort(v[i].begin(),v[i].end());
}
for(int i=0;i<n;i++){//没有被标记的就是根节点
if(!fg[i]){
root = i;
break;
}
}
temp.push_back(root);//源头 根节点
dfs(root);
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i];
if(i != ans.size()-1) cout<<" ";
}
return 0;
}