繁体   English   中英

连接有向无环加权图中的两个随机节点

[英]Connecting Two Random Nodes in a Directed Acyclic Weighted Graph

概括

所以我有一个有向无环加权图,其中每条边都有一个输入和输出节点,每个节点都有一个 ID,我使用字典将所有传入边通过其 ID 映射到一个节点,另一个对所有传出边执行相同操作当呈现节点 ID 时,我可以在 ~O(1) 时间内告诉所有传入和传出边缘。

要求

我需要能够以一种方式添加新的随机边(即连接两个随机节点),以保证无论图形有多大,它都不会有任何循环。

我试过的

由于我可以完全控制如何构建我的图,我可以对其进行拓扑排序并使用卡恩算法来确定对于两个均匀随机选择的节点 N1 和 N2,该图是否会导致 O(n) 时间的循环。 问题是如果这样做呢? 我必须尝试一个新的随机对并重复这个过程,直到我幸运为止。 这听起来好像它会随着图的缩放非常糟糕,因为图的边越密,新的随机图就越有可能创建一个循环。

我还阅读了这篇文章: 生成随机 DAG ,这在本质上与我的问题相似,但是,我无法使用建议的解决方案根据节点的 ID 连接节点,只能将较小的 ID 连接到较大的 ID(之前出现的节点)节点是新的)由于我对问题的其他限制。

有没有办法设计一种结构,它只允许我在节点之间随机选择,如果通过新的边连接,没有一个节点会产生与内存开销无关的循环? 这应该是一个 O(1) 操作。

我有一个O(1)解决方案来检查图中是否可以包含一条边。 但是,插入边缘需要最坏情况的O(n)

您可以维护一个二元可达性矩阵R ,其中R[u, v]=1如果您可以从当前图中的u到达v ,否则R[u, v]=0 R可以使用Floyd-Warshall计算一次。

如果您想检查是否可以包含边(u,v)您现在只需检查是否R[v, u] = 0 如果它是R[v, u] = 1您正在通过插入(u,v)构建一个圆。

剩下的问题就是更新这个结构。 如果您最终将边(u, v)插入图中,您将设置R[u, v] = 1 此外,所有能够到达u ( R[:,u]=1 ) 的节点现在都能够到达v ( R[v,:] = 1 ) 所能到达的所有节点。 因此R[i, j] = 1如果R[i,u] = 1R[v:j] = 1 R[i, j] = 1您将需要设置您的条目R[i, j] = 1 R[v:j] = 1

不幸的是,在最坏的情况下,更新步骤将花费 O(n)

如果要随机选择一条可能的边,则必须另外维护和更新通过相同结构的可能边列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM