Graph 无向图到树的转换
给定一个节点在空间中有一个笛卡尔坐标,该坐标具有树的一般形状,是否有一种算法将图形转换为树,并找到合适的根节点 请注意,我们对“树”的定义要求分支不以锐角从父节点发散 请参见下面的示例图。我们如何找到红色节点Graph 无向图到树的转换,graph,tree,graph-theory,nodes,Graph,Tree,Graph Theory,Nodes,给定一个节点在空间中有一个笛卡尔坐标,该坐标具有树的一般形状,是否有一种算法将图形转换为树,并找到合适的根节点 请注意,我们对“树”的定义要求分支不以锐角从父节点发散 请参见下面的示例图。我们如何找到红色节点 这里有一个关于如何解决您的问题的建议 先决条件 符号: g图形,g.v图形顶点 v、w、z:单个顶点 e:单个边缘 n:顶点数 无向树g和给定节点g.v的任意组合唯一地确定根为g.v的有向树(可通过归纳证明) 主意 通过g所暗示的定向树中的方向来补充g的边,并通过g节点处的局部
这里有一个关于如何解决您的问题的建议 先决条件
- 符号:
图形,g
图形顶点g.v
:单个顶点v、w、z
:单个边缘e
:顶点数n
- 无向树g和给定节点g.v的任意组合唯一地确定根为g.v的有向树(可通过归纳证明)
- 通过
所暗示的定向树中的方向来补充g
的边,并通过g
节点处的局部计算来补充尚未找到的根节点g
- 这些方向将表示节点之间的子-父关系(
:v->w
child,v
parent)w
- 完全标记的树将包含一个outdegree为0的唯一节点,它是所需的根节点。最终可能会有0个或多个根节点
g.v
中的所有顶点最初都标记为未访问、未完成让
v
成为当前访问的顶点
- 2.1从随机选择的
开始,顺时针扫描连接e_0
的所有边,扫描顺序为v
e_0
- 2.2。确定包含锐角的相邻边的方向。
。e_1=(v,w_1),e_2(v,w_2)
相邻:wrt根据其用
括起的角度订购 [注:不保证存在这样一对,请参见第2条注释和最后一条注释。如果没有锐角,请在2处继续。下一个节点。]e_0
- 2.2.1已知边缘
的方向:e_1、e_2
:不可能,因为一个祖父母子女片段会包含一个锐角w_1->v->w_2
w_1 v一个简单的解决方案是围绕红色节点或节点中心定义一个二维矩形,并使用摩尔曲线计算每个节点。穆尔曲线是一个空间填充曲线,更多的是希尔伯特曲线的一个特殊版本,其中起始点和结束点是相同的,坐标位于2D矩形的中间。一般来说,您的问题看起来像一个离散寻址空间问题 在这个无向图的例子中,任何节点都可以作为根,这样就可以得到一个合适的树。如果我做对了,哪个节点是根取决于节点的空间排列。但我不清楚“分支不会以锐角从父节点发散”是什么意思。你能澄清一下吗?您能否解释一下,例如,为什么最顶部或最右侧的节点不能成为应用程序的根节点?@paniwani:您的意思是,将兄弟节点链接到其(公共)父节点的分支之间的角度不能是锐角吗?除了坐标和图形结构之外,您还有什么数据结构需要处理吗?除了根节点的阶数,你的树是二进制的吗?二元树将更容易处理,因为相邻边缘之间的3个角度正好是1个,所以父/子关系可以在本地确定。@潘尼瓦尼:请注意,你的问题似乎是不明确的:考虑任何Steiner树;树枝之间根本没有锐角。因此,任何节点都可以被选为根节点,而不会违反您的约束。不是每个节点都可以是树的根,这取决于您如何查看图形吗?该死。。我一直在寻找OP问题的反面,但这个问题解决了。解释得很好,记录得很好。回答得很好。(我知道是老帖子)
- 2.2.1已知边缘