给定一个通用图结构G=(V,E)
,没有父节点,叶节点和子节点的概念,而只有邻居关系,是否有一种算法(或一系列算法)可以找到:
1)如果G
它是否是一棵树(检查|V| = |E|+1
是否足够?)
2)如果图实际上是一棵树,它的叶子和中心是什么? (即,图的节点可最大程度地减少树的深度)
谢谢
最佳答案
如果将树的“中心”定义为“使树深度最小的图的节点”,则找到直径的方法比找到直径的方法更简单。
d[] = degrees of all nodes
que = { leaves, i.e i that d[i]==1}
while len(que) > 1:
i=que.pop_front
d[i]--
for j in neighbors[i]:
if d[j] > 0:
d[j]--
if d[j] == 1 :
que.push_back(j)
que中剩下的最后一个是中心。
您可以通过考虑直径路径来证明这一点。
为简化起见,我们假设直径路径的长度为奇数,因此路径的中间节点是唯一的,我们称该节点为M,
我们可以看到:
直径路径已插入que
在M已被插入que之后被推,则N必须
比直径路径的路径更长。因此,N不存在。 M必须是最后一个
在que
关于algorithm - 如何查找图是否为树及其中心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13113430/