当前位置: 首页 > 知识库问答 >
问题:

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

龙俭
2023-03-14

总结

因此,我有一个有向无环加权图,其中每条边都有一个输入和输出节点,每个节点都有一个ID,我使用一个字典将所有传入的边映射到一个节点的ID,并使用另一个字典对所有传出的边进行同样的操作,这样,当出现节点ID时,我可以在大约O(1)时间内告诉所有传入和传出的边。

要求

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

我试过的

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

我也读过这篇文章:生成一个随机DAG,这在本质上与我的问题类似,但是,由于我对这个问题的其他限制,我不能使用建议的解决方案来基于它们的id连接节点,并且只能连接较小的到较大的id(之前有新节点的节点)。

问题

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

共有1个答案

古弘
2023-03-14

我有一个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。此外,所有能够到达uR[:, u]=1)的节点现在都能够到达vR[v,:]=1)可访问的所有节点。因此,您需要设置您的条目R[i, j]=1如果R[i, u]=1R[v: j]=1

不幸的是,在最坏的情况下,更新步骤需要O(n)。在实践中,当图形仍然相当稀疏时,您应该能够利用稀疏矩阵表示(对于每行< code>u具有索引< code>v的散列列表,其中< code>R[u,v] = 1)来有效地实现这一点,并且要快得多。

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

 类似资料:
  • 有没有一种方法可以在NetworkX甚至没有NetworkX的情况下做到这一点?

  • 我需要帮助在一个未加权无向图中找到两个节点之间的所有最短路径。 我能够使用BFS找到一条最短路径,但到目前为止,我还不知道如何找到并打印出所有路径。 知道我可以使用的算法/伪代码吗?

  • 给定:有权边的有向无环图,其中一个节点可以有多个父节点。 问题:对于根节点的每个子节点,找到一条从该子节点到某个叶的最小代价(权重之和)路径。一个节点只能存在于一个这样的最小开销路径中。 图表示例: > 这个逻辑有道理吗?我担心这种消除冲突的迭代方式可能对某些图不收敛。例如,在重新计算节点2的最小路径时,如果现在发现2->5是最小路径,并且假设在第一次迭代期间,节点5在其他节点的最小路径中使用,那

  • 背景:我是图论的新手,特别是“图割”。请不要太技术和速度。谢谢。 假设我有一个加权无向连通图G=(V,E)。我有一个变量a,它包含一个整数值,我想从图G中删除/裁剪所有权重低于a值的边。 问题1:如果图论中已经存在这一点(我看到了max-cut、min-cut、s-t cut,等等),它怎么称呼? 问题2:我如何使用数学符号正式表达/定义这种方法。 谢谢你的建议。

  • A-B-C-D A-B-C-E A-B-C-F 我的想法是,我需要同时使用DFS和BFS,但我不确定这是否有效?