LA3902树形网络递归

本文介绍了如何解决一个涉及网络结构的题目,该题目要求在无环图中,从指定server出发找到k距离内的叶子节点。通过将无根树转化为有根树,从最深叶子节点向上找到k个祖先作为server,以此实现最优解。文章提供了DFS的代码实现,讨论了邻接链表的构建和避免死循环的方法。
摘要由CSDN通过智能技术生成

经典题,需要温习。

题目链接:点击这里

总体思路

  1. 此题是网络结构,好久没做过这种题了。需要注意的是,这里有n个点,只有n-1条边,一定是无环图。因此,此题是无根树。
  2. 处理无根树比较麻烦,我们只知道一台server的编号,可以从这个server出发进行DFS,找到在其k距离范围内能达到的叶子节点(client)。但接下来怎么做呢?如何找到剩余叶子节点的最小server数呢?
  3. 因此,可以将无根树转化为有根数,就把server当作根节点,第一次DFS找到可以到达的所有叶子节点,然后从深度最深的叶子节点出发,找到其k祖先,将其设置为server,很容易证明这样是最省的。

代码实现

  • 思路不是很难想,但代码上需要有些技巧。

树的构建

  • 我们知道,可以使用邻接矩阵来构建,但在无向图中太浪费空间,并且此题n最大可以去1000,会造成内存溢出。
  • 因此我们可以采用邻接链表的形式,由于此题只有编号没有其他信息,因此可构建树vector<int> nodes[maxn];
  • 如何快速的找到其k个祖先呢?这里使用了一个数组进行存储其父节点,需要注意的是,由于此题是无向图,因此要注意方向,不然会造成死循环。

示例代码

  • 由于深度不超过k的叶子节点已经被服务器覆盖了,因此我们存储深度的时候,只存储深度大于k的节点,使用DFS来覆盖。

    
    #include <iostream>
    
    
    #include <vector>
    
    
    #in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值