输出路径
记录每个点的前一个点
记录最长路径的最后一个点
便可以从后往前得到最长路径
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e4+10;
//int a[N],h[N],cnt[N];
int e[N],ne[N],idx,h[N],pre[N];
int n,end1;
int ans[N],b[N];
int dist[N];
void insert(int a,int b)
{
pre[b]=a;
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int bfs()
{
int ans1=0;
for(int j=0;j<n;j++)
{
memset(dist,0,sizeof dist);
queue<int> q;
q.push(j);
while(!q.empty())
{
int hh=q.front();
q.pop();
for(int i=h[hh];i!=-1;i=ne[i])
{
int p=e[i];
q.push(p);
dist[p]=dist[hh]+1;
if(dist[p]>=ans1)
{
end1=p;
ans1=dist[p];
}
}
}
}
return ans1;
}
int main()
{
//memset(ne,-1,sizeof ne);
memset(h,-1,sizeof h);
memset(pre,-1,sizeof pre);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
if(k==0) continue;
else
{
for(int j=1;j<=k;j++) scanf("%d",&b[j]);
sort(b+1,b+k+1);
for(int j=1;j<=k;j++) insert(i,b[j]);
//for(int j=k;j>=1;j--) insert(i,b[j]);
}
}
int res;
res=bfs()+1;
int k=res;
//printf("endr=%d\n",endr);
printf("%d\n",res);
for(int i=end1;i!=-1;i=pre[i]) ans[k--]=i;
for(int i=1;i<=res-1;i++) printf("%d ",ans[i]);
printf("%d",ans[res]);
}
dfs
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e4+10;
//int a[N],h[N],cnt[N];
int e[N],ne[N],idx,h[N],pre[N];
int b[N];
bool st[N],st1[N];
int ans[N];
int res=0,end1,n;
void insert(int a,int b)
{
pre[b]=a;
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(int x,int sum)
{
st1[x]=1;
if(sum>res)
{
res=sum;
end1=x;
}
//printf("h[x]=%d\n",h[x]);
for(int i=h[x];i!=-1;i=ne[i])
{
int j=e[i];
if(!st1[j])
{
//printf("j=%d\n",j);
dfs(j,sum+1);
}
}
}
int main()
{
//memset(ne,-1,sizeof ne);
memset(h,-1,sizeof h);
memset(pre,-1,sizeof pre);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
if(k==0) continue;
else
{
for(int j=1;j<=k;j++) scanf("%d",&b[j]),st[b[j]]=1;
sort(b+1,b+k+1);
for(int j=k;j>=1;j--) insert(i,b[j]);
//for(int j=k;j>=1;j--) insert(i,b[j]);
}
}
for(int i=0;i<n;i++)
{
if(st[i]==0)
{
dfs(i,1);
break;
}
}
int k=res;
printf("%d\n",res);
for(int i=end1;i!=-1;i=pre[i]) ans[k--]=i;
for(int i=1;i<=res-1;i++) printf("%d ",ans[i]);
printf("%d",ans[res]);
}
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
vector<int>v[N];
int pre[N], h[N];
void bfs(int root, int& maxh, int& leaf) {
queue<int>q;
q.push(root);
h[root] = 1;
pre[root] = -1;
while (!q.empty()) {
root = q.front();
for (int i = 0; i < v[root].size(); i++) {
q.push(v[root][i]);
pre[v[root][i]] = root;
h[v[root][i]] = h[root] + 1;
if (maxh < h[v[root][i]]) {
maxh = h[v[root][i]];
leaf = v[root][i];
}
}
q.pop();
}
}
void ouput(int x) {
if (pre[x] == -1) cout << x;
else {
ouput(pre[x]);
cout << " " << x;
}
}
int main() {
int n, root = 0, maxh = 1, leaf; cin >> n;
for (int i = 0; i < n; i++) {
int k; cin >> k;
root += i;
while (k--) {
int x; cin >> x;
v[i].push_back(x);
root -= x;
}
stable_sort(v[i].begin(), v[i].end());
}
bfs(root, maxh, leaf);
cout << maxh << endl;
ouput(leaf);
return 0;
}