CCF CSP认证201503-4 网络延时(DFS求树的直径)

201503-4 网络延时

题目
在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路

这道题求最长路,我一开始想到的是用dp求DAG最长路,可是写着不太对劲,本来dp就不太熟,越写越迷糊。然后想着应该可以根据结点的层数来计算最长路,随后就有了如下想法。

所求的最长路一定会等于,某个结点的,最大深度的两个子树,的深度之和,或者等于这个结点(该结点只有一颗子树)的子树深度。

按照这个想法进行递归搜索即可AC。详见代码。

网上大佬说,这叫求树的直径,可以通过两次bfs或dfs求解。第一次从任一结点起,找距其最远的点(该点一定是最长路的端点),第二次从该最远点出发找最远点,这两个点之间的就是最长路。

然后还有一种方法是树形dp,我合计动手实现一下,写着写着发现这跟我之前的做法是一样的原理!

AC代码如下

//ccf csp201503-4 网络延时
//原始代码
#include<vector>
#include<algorithm>
using namespace std;
vector<int> child[10005];
int n,m,ans=0;

int dfs(int x){
   //返回以x为根结点的树的深度
    if(x>n||child[x].size()==0) return 0;
    int Max=0,Sec=0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值