- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个undirected graph,其中每个节点在空间中具有一棵树的一般形状的笛卡尔坐标,是否存在一种算法将图转换为树并找到合适的根节点?
请注意,我们对“树”的定义要求分支不要以锐角偏离父节点。
请参见下面的示例图。我们如何找到红色节点?
最佳答案
这是关于如何解决您的问题的建议。
先决条件
符号:g
图,g.v
图顶点v,w,z
:单个顶点e
:单个边缘n
:顶点数
无向树g和给定节点g.v的任何组合唯一地确定根g.v的有向树(通过归纳证明)
理念
通过g
节点所隐含的有向树中的方向和尚未被发现的根节点来补充g
的边缘。
这些方向将表示节点(g
:v -> w
子级,v
父级)之间的子级-父级关系。
完全标记的树将包含一个以0度为外的唯一节点,这是所需的根节点。您可能最终得到0个或多个根节点。
算法
假定图形/树结构的标准表示形式(例如,邻接表)w
中的所有顶点最初都标记为未访问,未完成。
按任意顺序访问所有顶点。跳过标记为“完成”的节点。
令g.v
为当前访问的顶点。
2.1从随机选择的v
开始按顺时针方向依次链接v
的所有边缘,其顺序为边缘与e_0
的角度。
2.2。将相邻的边缘e_0
定向为锐角。
相邻:根据e_1=(v,w_1), e_2(v,w_2)
包围的角度排序。
[注意:不能保证有这样的一对,请参阅第二条评论和最后一句话。如果没有锐角,则从2.下一个节点继续。 ]
2.2.1边缘e_0
的方向是已知的:e_1, e_2
:不可能,因为祖父母-儿童段将围成一个锐角w_1 -> v -> w_2
:不可能,原因相同w_1 <- v <- w_2
:不可能,树中没有度数大于1的节点w_1 <- v -> w_2
:
唯一可能的一对方向。 w_1 -> v <- w_2
以前可能已经被定位。如果先前的方向违反了当前的分配,则问题实例没有解决方案。
2.2.2这种分配意味着在子图上的树结构是由在不包含e_1, e_2
e_2`的路径上从w_1
(w_2
)可到达的所有顶点所诱导的。将两个诱导子树中的所有顶点标记为完成
[注意:子树结构可能违反角度约束。在这种情况下,问题无法解决。 ]
2.3标记e_1 (
已访问。在顶点v
中完成步骤2.2之后,检查尚未分配方向的连接边数v
。nc
:这是您一直在寻找的根源-但您必须检查解决方案是否与您的约束兼容。nc = 0
:将此边设为nc = 1
。
就像在树上一样,该边的方向是v-> z。将v标记为完成。
2.3.1检查(v,z)
是否标记为完成。
如果不是,请检查连接z
的未定向边缘的数量nc2
。
z
= 1:对nc2
取z
,重复步骤2.3。
如果尚未找到根节点,则问题实例是不确定的:
随意调整其余未定向的边缘。
备注
终止:
每个节点最多访问4次:
每步骤2次
每步最多两次两次2.2.2
每步最多一次2.3
正确性:
按照步骤2.2.1定向所有包含锐角的边缘
复杂度(时间):
访问每个节点:O(n);
顺时针扫描通过连接给定顶点的所有边需要对这些边进行排序。
因此,您需要在v
约束下的O( sum_i=1..m ( k_i * lg k_i ) )
顶点处使用m <= n
。
总的来说,这需要sum_i=1..m k_i = n
,因为对于任何O ( n * lg n)
,sum_i=1..m ( k_i * lg k_i ) <= n * lg n
都指定了sum_i=1..m k_i = n
(可通过应用滞后范围优化来证明)。
[注意:如果您的树木的度数受常数限制,则理论上您会在受影响的每个节点上按恒定的时间排序;在这种情况下总计:m <= n
]
子树标记:
如果实现为dfs,则此过程最多可访问图形中的每个节点2次。因此,用于调用此子例程的O(n)
总计。
总计:O(n)
复杂度(空间):O(n * lg n)
进行排序(顶点度不恒定)。
问题可能不明确:
多种解决方案:例如斯坦纳树
没有解决方案:例如形状像双箭头(<->)的图形
关于graph - 无向图转换为树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025342/
我对这两个概念感到困惑:In-graph replication和 Between-graph replication阅读 Replicated training 时在 tensorflow 的官方
我对这两个概念感到困惑:In-graph replication和 Between-graph replication阅读 Replicated training 时在 tensorflow 的官方
我正在尝试使用 https://graph.windows.net/{teantId}/users/[email protected]/thumbnailPhoto?api-version=1.6 访
我正在尝试使用 Graphs.jl 模块从 Julia 中的图中获取子图。我有图,并将其顶点和边存储到列表中,然后我的算法在该列表中移动并删除不属于新子图的节点和边。到这一部分,一切正常,在整个算法之
我是 Arangodb 的新手。我对使用哪个图形 API 感到困惑。我可以在 http://localhost:8529/ url 看到一张图。官方视频讨论了 Gremlin(我也安装了它)。然后就是
截至今天,文档建议使用 Microsoft Graph 而不是 Azure AD Graph API 来访问 Azure AD/B2C 资源。 之前,通过 Azure AD Graph API,我们可
我们希望将 .NET 应用从使用 Azure AD Graph 迁移到 Microsoft Graph API。目前我们正在使用包 Microsoft.WindowsAzure.Configurati
也许我遗漏了什么,但我不知道为什么 GraphQL 的标题中有 graph。 我猜这与 Graph Theory 有关和 graph并且可以看到某种联系,但如果有人能用简单的术语解释它就太好了。 最佳
我正在尝试使用API使用户的Facebook Pages具有已关联的Instagram企业帐户: https://graph.facebook.com/v2.7/me/accounts?field
如何导出我通过调用 GraphPlot 获得的输出的调整大小版本 (或 TreePlot 如果它们产生不同的输出)到 jpg 文件? 目前,我只是调用 Export[file_name, G]在哪里
如何在使用 gremlin 查询创建边缘之前检查边缘是否已存在?如何更新现有边缘而不是删除并重新创建? 最佳答案 我不确定您是否还在寻找答案;然而,简单的答案是 Cosmos DB 在 Gremlin
我使用的是 Xcode 10.2.1 和 macOS Catalina Developer Beta 2。每当我尝试使用内存图调试器时,我都会收到此错误: Memory Graph Debugger:
我正在设置一个机器人以在Facebook页面上自动发布。但是,当我运行脚本时,图形API会引发以下错误: Graph returned an error: (#200) Requires either
如何制定包含非英语字符(例如日耳曼语Umlauts)的Microsoft Graph /myOrganization/users OData查询? 例子: 我的租户中有一个名为“ThomasMülle
我正在寻找发布目标帖子时可以与Facebook Graph API一起使用的国家/州/城市列表。 我在this页面上找到了一个JSON文件,但是该文件无法正确解析,我也怀疑它是否可以用于发布目标,因为
关于 Graph API,帖子的分享数、帖子见解的分享数和页面上显示的分享数不相同。我假设这些代表相同的计数。我的假设错了吗? 来自帖子: https://graph.facebook.com/XXX
我正在尝试访问作为嵌套子站点一部分的列表的项目,如下所示: https://{mytenant}.sharepoint.com/ vendorSiteCollection/ v
我打算开发一个应用程序,但开发人员告诉我每个 IP 每 600 秒有 600 次调用的限制。该应用程序有很多场景,这还不够。有没有办法以某种方式增加限制?或者 Facebook 是否提供任何高级帐户或
我在 Neo4j 中创建了一张伦敦地铁 map 。站点通过 :CONNECTED_TO 关系连接,时间值表示停止之间需要多长时间(目前这些是我为测试输入的随机值)。位于多条线路上的车站每条线路都有一个
我正在尝试拉回所有用户的列表,我的预期结果将是大约 20,000 个用户。 图表似乎将我限制为 1000。 图调用https://graph.microsoft.com/v1.0/users返回 10
我是一名优秀的程序员,十分优秀!