有向树的直径

darkstar21cn 2002-11-13 04:03:11
有向树(就是没有环路的有向连通图)的直径是最大两个节点间距(用边的数目表示)。要求C++算法。
高分赠送!!!(另有送分)
...全文
207 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Riemann 2002-12-12
  • 打赏
  • 举报
回复
zzwu(未名)仅是举例说明“P离Q最远,但Q离P可以不是最远”。
darkstar21cn 2002-12-04
  • 打赏
  • 举报
回复
但是如果是:
e
.
f
.
a...b...c...d
e到d最远,d到e也是最远.
zzwu 2002-11-29
  • 打赏
  • 举报
回复
这一算法大概在十年前的<科学>杂志(美国)上曾登载过.我就利用它来为蛋白质寻找主链的.但必须是无向图.
zzwu 2002-11-29
  • 打赏
  • 举报
回复
看看例子就清楚了:


p
|
a ---b---c----d---e----q
|
f

上图中, q离开p最远,但离开q最远的不是p,而是a
darkstar21cn 2002-11-29
  • 打赏
  • 举报
回复
to zzwu(未名):
能否说清楚点?——难道P离Q最远,Q离P不是最远吗?


谁能解出来,高分相送!!!!!——解出者零给300分!!!!!
zzwu 2002-11-25
  • 打赏
  • 举报
回复
如果为有向图,则可从所有源点(入度为0的点)出发,搜索一次就行了.
zzwu 2002-11-25
  • 打赏
  • 举报
回复
如果没有回路,这一问题很容易解:

1.从树上任意点P出发,寻找与P距离最远的点Q,
2.再从Q出发,寻找与Q距离最远的点T,

则Q-T的距离就是此树的直径.

这一工作我以前在为蛋白质寻找主链时曾用到,参见www.zzwu.net
TAlucard 2002-11-25
  • 打赏
  • 举报
回复
我倒觉得这是个动态规划问题
darkstar21cn 2002-11-22
  • 打赏
  • 举报
回复
对不起,题目要求的不是二叉树而是一般的树。
另外:
还有一种算法就是,每一轮删除出度为0的节点,并删除掉与之有关系的边。在进行下一轮,所需的轮数乘2就是树的直径。
mmmcd 2002-11-22
  • 打赏
  • 举报
回复
1.任取意顶点开始,深度优先搜索找到距它最远点。
2.从最远点出发,重复深度优先搜索,找到距它最远的点,这时找到的间距就是整个图中最大的。
darkstar21cn 2002-11-20
  • 打赏
  • 举报
回复
是不是问题太难了?没有人能回答?
算了,我给出几种算法:
1、使用Floyd算法,把最短路径存放在一个数组中,然后找到最大的一个就是树的直径,时间复杂度O(n)(n为总的节点数)。
2、使用广度有限搜索(BFS),每个节点都要进行,每次都能得到一个最大距离。所有节点里最大的就是树的直径。时间复杂度,BFS的时间复杂度为O(n(n+e))(e为总的边数)。
3、创建一棵树,每一个节点都比正常的多两个域用于分别记录器左右子树的高度,然后在求树的直径。

注:前两种是书上的答案,但我觉得不太好,今天突然想到第三种方法,故写来,与大家分享,也希望如果谁愿意有条件,帮我验证一下。
算法实现如下:

struct Tree {
Char Data; //在这里它没什么用处
struct Tree *Lchild,*Rchild;
int Lhigh,Rhigh;
};

void Adjust(Tree *T)
{
if (T->Lchild!=NULL) {
Adjust(T->Lchild);
T->Lhigh=(T->Lchild->Lhigh>T->Lchild->Rhigh?
T->Lchild->Lhigh:T->Lchild->Rhigh)+1;
}
else T->Lhigh=0;

if (T->Rchild!=NULL) {
Adjust(T->Rchild);
T->Rhigh=(T->Rchild->Lhigh>T->Rchild->Rhigh?
T->Rchild->Lhigh:T->Rchild->Rhigh)+1;
}
else T->Rhigh=0;

}

int DiaofTree(Tree *T,int& Dia=0)
{
if (Dia<T->Lhigh+T->Rhigh+1) Dia=T->Lhigh+t->Rhigh+1;
if (T->Lhigh*2>Dia) DiaofTree(T->Lchild,Dia);

if (T->Rhigh*2>Dia) DiaofTree(T->Rchild,Dia);
}
darkstar21cn 2002-11-19
  • 打赏
  • 举报
回复
up!`
darkstar21cn 2002-11-19
  • 打赏
  • 举报
回复
有向树实际上就是一个树——不带回路的图。要求自己定义存储结构。
zzwu 2002-11-13
  • 打赏
  • 举报
回复
带回路吗?
sameboat 2002-11-13
  • 打赏
  • 举报
回复
是二叉树吗?还是普通有向树?
我还没有仔细考虑,
(1)但我觉得要用到树的遍历;
(2)直径的一端定是叶结点,另一端可能是叶结点也可能不是。
另外,我觉得这很象一个作业,你还是独立完成吧,呵呵,别人只能给你一些建议供参考。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧