G=(V,E)
给定一个没有父节点、叶节点和子节点概念但只有邻域关系的通用图结构,是否有一种算法(或一系列算法)可以找到:
1)G
是否是一棵树(检查是否足够|V| = |E|+1
?)
2)如果图实际上是一棵树,它的叶子和中心呢?(即最小化树深度的图节点)
谢谢
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,
我们可以看到:
不,这还不够——一棵树是一个有n-1
边的连接图。未连接的图中可能有n-1
边 - 它不会是一棵树。
您可以运行BFS来查找图是否已连接,然后计算边数,如果图是树,这将为您提供足够的信息
叶子是具有由等式给出的节点v
度数的节点(每个节点只有一个连接的顶点)d(v)
d(v) = 1
(1) 答案假设无向图
(2) 在这里,n
表示顶点数。