题意: 给你一棵树,让你求出最长的那条链,如果不唯一,输出最小序列.
思路: 直接dfs根节点,然后用path数组记录前驱节点.
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
int n,k,v;
vector<int>g[N];
vector<int>ans;
int in[N],path[N];
void dfs(int u,int depth) {
if(g[u].size()==0&&depth>ans.size()) {
ans.clear();
int now = u;
while(now!=-1) {
ans.push_back(now);
now=path[now];
}
return;
}
for(int i=0; i<g[u].size(); i++) {
v = g[u][i];
path[v] = u;
dfs(v,depth+1);
}
}
int main() {
int n,k;
cin>>n;
for(int i=0; i<n; i++) {
cin>>k;
for(int j=1; j<=k; j++) {
cin>>v;
in[v]++;
g[i].push_back(v);
}
sort(g[i].begin(),g[i].end());
}
int rt;
for(int i=0; i<n; i++) {
if(!in[i]) {
rt = i;
break;
}
}
path[rt] = -1;
dfs(rt,1);
cout<<ans.size()<<endl;
reverse(ans.begin(),ans.end());
for(int i=0; i<ans.size(); i++) {
if(i==0) cout<<ans[i];
else cout<<' '<<ans[i];
}
cout<<endl;
return 0;
}