题目分为两步:找到源头;寻找最长链
第一步较为简单,在输入时候设置一个标志数组即可,之后循环判断可以得出源头
第二步使用dfs,dfs递归调用,重点:回溯
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<stack>
#include<string>
#include<queue>
#include<vector>
#include<cctype>
#include<map>
using namespace std;
int n;
const int maxn=10001;
vector<int>v[maxn];
vector<int>temp;
int t[maxn];
void Dfs(int index,vector<int>&p){//这里需要用到&p,否则会内存过大
if(p.size()>temp.size()){//找到更深的,更新temp数组
temp.clear();
temp=p;
}
for(int i=0;i<v[index].size();i++){//标号为index的孩子节点
p.push_back(v[index][i]);//先将孩子节点入p
Dfs(v[index][i],p);//深搜孩子节点
p.pop_back(); //记得回溯!!
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int k;
cin>>k;
while(k--){//当k等于0 时,不执行循环,所以不需要特殊考虑
int x;
cin>>x;
v[i].push_back(x);
t[x]=1;//将所有的孩子节点的t都设为1,这样只需要找到不是1的节点,那个节点就是根节点!
}
if(v[i].size()){
sort(v[i].begin(),v[i].end());//每次放完孩子都需要排序,以求得最小的编号
}
}
for(int i=0;i<n;i++){
if(!t[i]){//这一步的目的是找到根节点进行深搜,
vector<int>p;
p.push_back(i);
Dfs(i,p);//从根节点开始搜索,每次更新数组p
break;
}
}
cout<<temp.size()<<endl;
for(int i=0;i<temp.size();i++){
if(!i) cout<<temp[i];
else cout<<" "<<temp[i];
}
}