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;

最低0.47元/天 解锁文章
410

被折叠的 条评论
为什么被折叠?



