题目链接
https://pintia.cn/problem-sets/994805046380707840/problems/1111914599412858888
思路
dfs维护最大深度并记录最深处点的编号,同时需要在输入边的过程中标记,为了后面能找到入口(入口就是唯一未标记的点),不可能所有点都dfs一遍。
DFS代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int e[N],ne[N],h[N],idx,vis[N],st[N];
int n;
int MAX,res;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int p)
{
vis[u]=1;
if(p>res)
{
res=p;
MAX=u;
}
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(!vis[j])
{
dfs(j,p+1);
}
}
}
int main()
{
memset(h,-1,sizeof(h));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
for(int j=0;j<k;j++)
{
int x;
scanf("%d",&x);
st[x]=1;
add(i,x);
}
}
int i;
for(i=1;i<=n;i++)
{
if(!st[i])
{
break;
}
}
MAX=i;
dfs(i,1);
printf("%d\n",MAX);
return 0;
}