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

检查DAG图中的2个节点是否有共同的父节点

胡鸿远
2023-03-14

输入如下:

一个int[][],每个子数组包含2个int,即{parent,child},意味着有一个从parent->child的路径。

例如

{ { 1, 3 }, { 2, 3 }, { 3, 6 }, { 5, 6 }, { 5, 7 }, { 4, 5 }, { 4, 8 }, { 8, 9 } };
  1   2   4
   \ /   / \
    3   5   8
     \ / \   \
      6   7   9
[3, 8] => false
[5, 8] => true
[6, 8] => true

我的想法:

  • 将输入数据表示为一个DAG图,其中数据存储在像这样的映射中Map ,其中key是顶点,value是它的邻接列表。并且图形中的方向是相反的(与输入数据相比)为子->parent,以便于查找parent.
  • 使用函数FindAvailablePartners(整数顶点)查找单个顶点的所有父节点(直接和间接),并返回Set .
  • 因此,只需为每个输入顶点调用findavailableparents()一次,然后比较返回的2个是否有交集。如果是,那么他们有共同的父母;否则,它们不会。

我的问题是:

  • 上面解的时间复杂度在O(1)~O(E)之间,对吗?(E是图中的边计数)
  • 有更好的解决方案吗?

共有1个答案

邰钟展
2023-03-14

假设您有多个输入,现在BFS将花费大约O(E)时间来处理每个输入。

所有输入都可以在O(logn)中查询,如果我们做一些预先计算,大约需要O(nlogn)时间

基本上,您希望找到这些节点最不常见的祖先
这篇topcoder中的线程讨论了可以扩展为DAG的树的逻辑
您也可以参考这个问题来获得一些进一步的想法

 类似资料:
  • web3.eth.isSyncing()方法用来检查节点当前是否已经与网络同步。 调用: web3.eth.isSyncing([callback]) 返回值: 一个Promise对象,其解析值为Object或Boolean。如果节点尚未与网络同步, 则返回false,否则返回一个同步对象,具有以下属性: startingBlock - Number: 同步起始块编号 currentBlock

  • 问题内容: 如何使用Node的驱动程序检查ObjectID是否有效 我试过了 : 但是我不断收到异常,而不是对或错。(例外只是一个“ throw e; // process.nextTick错误,或“第一次滴答”中的“ error”事件” 问题答案: 不知道函数来自哪里,但是不在node-mongodb- native中 。 如果要检查由24个十六进制字符组成的字符串,则可以使用此正则表达式。 取

  • 我有以下课程: 我正在尝试实现一种方法: 这将检查是否是的祖先(任何深度,直到根)。 我需要一个密码查询。

  • 如何在有向无环图中找到多个节点的最小共同祖先? 我已经找到了很多关于这个主题的论文,但它们似乎都在DAG中找到了两个节点的LCAs。

  • 我是 D3 的新手。因此,我正在尝试呈现一个图形,其中两个或多个孩子可以具有相同的父级。我想知道如何使链接再次定向到同一节点?我有断开的链接.. 任何帮助都是巨大的。 这是我的代码...

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我的mySQL数据库中有如下表: 对于谓词,它将具有如下树视图: 我想创建一个可以选择起始节点并为此获得所有父节点的表单。例如,通过选择我想要获得: 步骤2: 有什么方法可以使用以下简单文本来打印此节点: 问题答案: 您的数据可以在RDF中表