返回   cpper编程论坛 > 算法
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2007-04-08
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 求一棵树的半径

树的半径的定义是树的任意两点间的最小距离的最大值。我的办法是任意取这个树的某条边e,将这两个树分为两个子树,分别以这条边的两个端点(v1, v2)为根,用广度优先搜索出该点到其子树各点的最小距离的最大值,然后将这两个树求出的值相加再加上一(这个距离还包括e的距离),计录下该值。然后对两个子树递归调用上述算法,算出来的最大值就是半径。
上述算法的思想是,如果树的半径值对应的某个路径通过e,那么该半径必定含有该边的两个端点(v1, v2)到其他端点的最大值。如果树半径对应的边没有通过e,那么在两个子树间再查找。综合这些的最大值就是树的半径。
由于两个子树的广度优先搜索的时间复杂度为O(V1), O(V2),T(V) = T(V1) + T(V2)+O(V),我推导出的这个方法的时间复杂度是O(V^2),还是高了点,有更快的算法没有?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2007-04-09
Elminster 的头像
超级版主
 
注册日期: 2002-09-09
帖子: 1,763
Elminster 正向着好的方向发展
默认

有更快的,应该是 O(|V|) 那么多吧。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2007-04-09
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认

那么思路到底是怎样的呢?老大给点提示吧
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2007-04-09
Elminster 的头像
超级版主
 
注册日期: 2002-09-09
帖子: 1,763
Elminster 正向着好的方向发展
默认

基本思路是动态规划。任选一个非叶子节点做根,然后从底下的叶子开始向上动态规划。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2007-04-10
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认

是不是这样的:先求树的所有子树的根节点到叶子的最大深度和次大深度,然后取其和的最大值就是树的直径。这样可以根据叶子向上计算得到直径,复杂度是O(v)。
PS:这个不算动态规划吧,子问题并没有重叠嘛
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2007-04-10
Elminster 的头像
超级版主
 
注册日期: 2002-09-09
帖子: 1,763
Elminster 正向着好的方向发展
默认

没错。
PS:我觉得它象动态规划,它就是动态规划,
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2007-06-14
初级会员
 
注册日期: 2007-03-05
帖子: 4
imgen 正向着好的方向发展
默认 回复: 求一棵树的半径 - 这个问题的二叉树的实现版本

int BinaryTreeHeight(node *p, int&maxHeightSum)
{
if (!p)
{
return 0;
}

int leftHeight = BinaryTreeHeight(p->left, maxHeightSum);
int rightHeight = BinaryTreeHeight(p->right, maxHeightSum);

maxHeightSum = max(leftHeight+leftHeight, maxHeightSum);
return max(leftHeight, rightHeight) + 1;
}

int findRadOfTree(node* head)
{
int maxHeightSum = 0;
BinaryTreeHeight(head, maxHeightSum);
return maxHeightSum;
}
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2007-12-24
普通会员
 
注册日期: 2006-03-08
帖子: 31
Juvexp 正向着好的方向发展
默认 回复: 求一棵树的半径 - 这个问题的二叉树的实现版本

引用:
作者: imgen 查看帖子
int BinaryTreeHeight(node *p, int&maxHeightSum)
{
if (!p)
{
return 0;
}

int leftHeight = BinaryTreeHeight(p->left, maxHeightSum);
int rightHeight = BinaryTreeHeight(p->right, maxHeightSum);

maxHeightSum = max(leftHeight+leftHeight, maxHeightSum);
return max(leftHeight, rightHeight) + 1;
}

int findRadOfTree(node* head)
{
int maxHeightSum = 0;
BinaryTreeHeight(head, maxHeightSum);
return maxHeightSum;
}

这个实现有问题吧,这句是什么意思:
maxHeightSum = max(leftHeight+leftHeight, maxHeightSum);

左子树为空就返回零了

改成
maxHeightSum = max(leftHeight+rightHeight, maxHeightSum);
也不对
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 08:50 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0