Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有向无环图中每个顶点不同路径数的线性时间算法_Algorithm_Dynamic Programming_Directed Acyclic Graphs_Topological Sort - Fatal编程技术网

Algorithm 有向无环图中每个顶点不同路径数的线性时间算法

Algorithm 有向无环图中每个顶点不同路径数的线性时间算法,algorithm,dynamic-programming,directed-acyclic-graphs,topological-sort,Algorithm,Dynamic Programming,Directed Acyclic Graphs,Topological Sort,我正在为算法模块编写以下过去的论文问题: 设G=(V,E)是一个简单的有向无环图(DAG)。 对于一对顶点v,u在v中,如果G中有一条从u到v的(有向)路径,我们说v可以从u到达 (我们假设每个顶点都可以从自身到达。) 对于v中的任何顶点v,设R(v)为顶点v的可达数,即从v可到达的顶点u在v中的数目。 设计一种算法,对于给定的DAG,G=(V,E),计算V中所有顶点V的R(V)值。 提供算法分析(即正确性和运行时间 分析)。 (最佳情况下,应尝试设计一个运行在 O(n+m)时间。) 到目前为止

我正在为算法模块编写以下过去的论文问题:

设G=(V,E)是一个简单的有向无环图(DAG)。
对于一对顶点v,u在v中,如果G中有一条从u到v的(有向)路径,我们说v可以从u到达 (我们假设每个顶点都可以从自身到达。)
对于v中的任何顶点v,设R(v)为顶点v的可达数,即从v可到达的顶点u在v中的数目。
设计一种算法,对于给定的DAG,G=(V,E),计算V中所有顶点V的R(V)值。
提供算法分析(即正确性和运行时间 分析)。
(最佳情况下,应尝试设计一个运行在 O(n+m)时间。)

到目前为止,我有以下想法:

以下用于查找DAG拓扑排序的算法可能很有用:

TopologicalSort(G)
  1. Run DFS on G and compute a DFS-numbering, N // A DFS-numbering is a numbering (starting from 1) of the vertices of G, representing the point at which the DFS-call on a given vertex v finishes.
  2. Let the topological sort be the function a(v) = n - N[v] + 1 // n is the number of nodes in G and N[v] is the DFS-number of v.
我的第二个想法是,动态规划也可能是一种有用的方法。
然而,我目前不知道如何将这两个想法结合成一个解决方案


如果有任何提示,我将不胜感激

编辑:不幸的是,下面的方法通常不正确。它可以对通过多条路径可以到达的节点进行多次计数

如果DAG是a,则以下想法是有效的,因为这保证了任意两个节点之间最多有一条路径

您可以使用以下步骤:

  • 查找度为0的所有节点(即没有传入边)
这可以在
O(n+m)
中完成,例如通过在所有边上循环 并标记作为任何边的端点的节点。具有0的节点 在程度上是那些没有被标记的

  • 从度为0的每个节点启动DFS
在对节点的DFS调用结束后,我们希望对该节点进行计算 节点的可达性信息

为了实现这一点,我们需要增加 此节点的后续节点。其中一些值可能已经被删除 已计算(如果DFS已经访问了后继者),因此 是一个动态规划解决方案

以下伪代码描述DFS代码:

function DFS(node) {
    visited[node] = true;
    reachability[node] = 1;

    for each successor of node {
        if (!visited[successor]) {
            DFS(successor);
        }
        reachability[node] += reachability[successor];
    }
}
对度为0的所有节点调用此函数后,
可达性
数组将包含图中所有节点的可达性

总体复杂度为
O(n+m)


我建议使用广度优先搜索方法

对于每个节点,添加连接到队列的所有节点。除此之外,还要维护一个单独的数组来计算可达性

例如,如果a->B,则

1.) Mark A as traversed
2.) B is added to the queue
3.) arr[B]+=1

这样,我们可以通过arr[]得到O(|v|+|E|)时间内所有顶点的R(v)

这些步骤是有用的;但是,我认为DFS的伪代码中可能有错误。我已经将其应用于我绘制的任意DAG,并且所有可达性条目的值都保持为0。实际上,在DFS中,可达性应该用1初始化(每个节点都可以到达自己)——现在编辑。还有另一个问题使得算法无效(一些节点可能被计数多次)。我正在考虑一种处理方法。