保证入口唯一
如何找到入口?没有被标记通往的点就是入口
建立单向图 然后mp标记层次
取队首的同时 判断层次
题目保证最远的那一层点唯一(最远的一层点只有1个)
方法1 bfs
vector<int> g[maxn];
int vis[maxn];
int main()
{
IO;
int n,k,t;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>k;
for(int j=1;j<=k;j++)
{
cin>>t;
g[i].push_back(t);
vis[t]=1;
}
}
int s=0;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
s=i;
}
queue<pii> q;
q.push(mp(s,1));
int maxlevel=0,maxdata=0;
while(!q.empty())
{
pii p=q.front();
q.pop();
int d=p.first;
int h=p.second;
if(h>maxlevel)//求最深层 保证结果唯一
{
maxlevel=h;
maxdata=d;
}
for(int i=0;i<g[d].size();i++) //所有通向的点
{
q.push(mp(g[d][i],h+1));
}
}
cout<<maxdata<<endl;
return 0;
}
方法2 dfs 本质差不多 加一个层次参数
dfs一般用全局变量 什么时候回溯?没有邻接点不走for循环自然回溯
vector<int> g[maxn];
int vis[maxn],maxlevel=0,maxdata=0;
void dfs(int s,int h)
{
if(h>maxlevel)
{
maxlevel=h;
maxdata=s;
}
for(int j=0;j<g[s].size();j++)
{
dfs(g[s][j],h+1);
}
}
int main()
{
IO;
int n,k,t;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>k;
for(int j=1;j<=k;j++)
{
cin>>t;
g[i].push_back(t);
vis[t]=1;
}
}
int s=0;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
s=i;
}
dfs(s,1);
cout<<maxdata<<endl;
return 0;
}