Algorithm 有向无环图中每个顶点不同路径数的线性时间算法
我正在为算法模块编写以下过去的论文问题: 设G=(V,E)是一个简单的有向无环图(DAG)。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)时间。) 到目前为止
对于一对顶点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
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初始化(每个节点都可以到达自己)——现在编辑。还有另一个问题使得算法无效(一些节点可能被计数多次)。我正在考虑一种处理方法。