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

具有多父节点的有向无环图

景宏富
2023-03-14

给定:有权边的有向无环图,其中一个节点可以有多个父节点。

问题:对于根节点的每个子节点,找到一条从该子节点到某个叶的最小代价(权重之和)路径。一个节点只能存在于一个这样的最小开销路径中。

图表示例:

2 -> 5  
2 -> 1 -> 9 -> 6
2 -> 1 -> 10 -> 6
Among which 2 -> 1 -> 10 -> 6 has minimum cost of 3.5
4 -> 11 -> 8
4 -> 7 -> 10 -> 6 
Among which 4 -> 7 -> 10 -> 6 has minimum cost of 3.0
For node 2, the path is 2 -> 1 -> 10 -> 6 : Cost 3.5
For node 4, the path is 4 -> 7 -> 10 -> 6 : Cost 3.0
For node 3, there is no such path.
Do:
    For each child node of the root:
         Find out min-cost path. Store that path and the cost.
    If conflicting paths exist:
         Compare the costs of conflicting paths and save "best parent" for each node. 
While there were conflicting paths;

>

  • 这个逻辑有道理吗?我担心这种消除冲突的迭代方式可能对某些图不收敛。例如,在重新计算节点2的最小路径时,如果现在发现2->5是最小路径,并且假设在第一次迭代期间,节点5在其他节点的最小路径中使用,那么我必须将节点5的“最佳父”重新分配为节点2,并重新迭代。在坚果壳中,每次我试图修复某个节点的最小路径时,我可能会改变另一个节点的最小路径。这样的算法能收敛到某个解吗?如果是,它的复杂性会是多少?

    在计算最小成本路径之前,有没有一种方法可以消除这种冲突?

  • 共有1个答案

    吴品
    2023-03-14

    是动态编程。

    首先将所有边反向生成一个新的图,我们称之为NEWG。

    1. 在newG中,没有父节点的节点的值为0。
    2. 对于newG中有父节点的每个节点,计算其父节点的值,然后选择最小值父节点,它必须是结果的一部分。
    3. 当询问来自原点gtaph的路径时,NEWG中的答案是相同的。(可能是答案中的边顺序相反)。
     类似资料:
    • 我是 D3 的新手。因此,我正在尝试呈现一个图形,其中两个或多个孩子可以具有相同的父级。我想知道如何使链接再次定向到同一节点?我有断开的链接.. 任何帮助都是巨大的。 这是我的代码...

    • 我必须在这个图上执行一些任务。1)找到所有没有后继的顶点。2)给没有后继的顶点赋值。(我可以用顶点属性来做这件事)。3)回溯图并用子节点的最小值更新每一层的所有父节点(甚至是中间父节点)。 例如, 根据上面的DAG,顶点{2,5,6,7}没有任何后继或外边。假设我将分别为顶点{2,5,6,7}赋值{3,2,4,6}。

    • 因此,在Hackerrank上的一个名为“非循环图”的编程竞赛中出现了这个挑战,它基本上可以归结为计算“有向非循环图”中每个节点可达的节点数。例如,假设你有一个这样的图: 可达性计数(包括源节点): 我的方法是“深度优先”遍历和记忆。环顾四周,但似乎运行时间无法进一步提高,因为在以下情况下会出现过度计数: 第三个节点将计算第四个节点,即使第二个节点已经计算了第四个节点。更糟糕的是,我只用JavaS

    • 我有一个XML文档,它包含一个非常复杂(对我来说)的结构,没有换行符。它有许多具有类似结构的元素: 我需要得到节点值的文本,这是节点成员的孩子也有孩子的名字与特定的文本(在这种情况下virtual_size)。也有可能存在几个类似的节点。我可以用[1]etc吗? 这让我知道了节点的名称,但是如何达到“值”节点呢?

    • 我正在尝试做一个使用组合键的场景。我想有更多的公钥,这样我就可以用其中任何一个密钥来签署一个txn。 该场景的参考如下:https://docs.corda.net/api/kotlin/corda/net.corda.core.crypto/-composite-key/index.html 根据我的理解,deployNodes任务使用单个公钥生成节点。如果我偏离了轨道,请纠正我。

    • 总结 因此,我有一个有向无环加权图,其中每条边都有一个输入和输出节点,每个节点都有一个ID,我使用一个字典将所有传入的边映射到一个节点的ID,并使用另一个字典对所有传出的边进行同样的操作,这样,当出现节点ID时,我可以在大约O(1)时间内告诉所有传入和传出的边。 要求 我需要能够添加新的随机边(即连接两个随机节点),以保证无论图有多大,它都不会有任何循环。 我试过的 由于我完全控制如何构建我的图,