L2-031 深入虎穴
解题思路
这题可以用邻接表 \(+\) DFS,就像前面的小字辈一样 。 也可以不用邻接表,这里我就没用邻接表,而且本题做法也可以用于小字辈。
不过确实有些变化,这种思路也是值得学习的 :往上搜索 ,但是整体依旧是由上到下的过程,因为递归会一直往上搜,直到碰见一个已经走过的地方,再往下返回,这个值是从上不断累加带到下面的。
当然 , 我们也可以写个void类型函数,用个全局计数数组来计算深度
我们只需要算出每个节点的深度,最深的节点就是答案
ac✅️代码
算法一(最简单的写法) :
记忆化搜索
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int parent[100010];
int depth[100010];
int getDepth(int i)
{
if(parent[i] == 0) return 1;//注意起点不一定是1,只有没有父母节点的才是起点
if(depth[i] != 0) return depth[i];
depth[i] = getDepth(parent[i]) + 1;
return depth[i];
}
int main()
{
int n;cin>>n;
for(int i = 1 ; i <= n ; i++)
{
int k;cin>>k;
for(int j = 0 ; j < k ; j ++)
{
int x;cin>>x;
parent[x] = i;
}
}
int maxDepth = 0;
int ans ;
for(int i = 1 ; i <= n ; i++)
{
int dis = getDepth(i);
if(dis > maxDepth) maxDepth = dis , ans = i;
}
cout<<ans<<endl;
return 0 ;
}
算法二(暂时意义不明):(但是会超时)因为太暴力了 , 何意味
#include<iostream>
using namespace std;
int parent[100010];
int dist[100010];
int target_node;
int max_d;
int startnode ;
void getDepth(int u , int d)
{
if( u == -1 )//在碰到终点时统计
{
if(d > max_d)
{
max_d = d;
target_node = startnode;
}
return ;
}
getDepth(parent[u] , d + 1);
}
int main()
{
int n;cin>>n;
for(int i = 1 ; i <= n ; i ++) parent[i] = -1;
for(int i = 1 ; i <= n ; i++)
{
int t;cin>>t;
for(int j = 1 ; j <= t ; j ++)
{
int x;cin>>x;
parent[x] = i;
}
}
for(int i = 1 ; i <= n ; i++)
{
startnode = i ;
getDepth(i , 0);
}
cout<<target_node<<endl;
return 0;
}

浙公网安备 33010602011771号