我想找到DAG中两个节点之间的路径数。 O(V ^ 2)和O(V + E)是可以接受的。
O(V + E)提醒我以某种方式使用BFS或DFS,但我不知道如何。 有人可以帮忙吗?答案 0 :(得分:20)
对拓扑进行拓扑排序,然后将目标顶点向后扫描到源。对于每个顶点v
,保留从v
到目标的路径数的计数。当您到达源时,该计数的值就是答案。那是O(V+E)
。
答案 1 :(得分:6)
从节点u到v的不同路径的数量是从节点x到v的不同路径的总和,其中x是u的直接后代。
为每个节点存储目标节点v的路径数(临时设置为0),使用相反方向从v(此处值为1)转发并为每个节点重新计算此值(总和所有后代的值)直到你到达你。
如果按拓扑顺序处理节点(方向相反),则可以保证在访问给定节点时已经计算了所有直接后代。
希望它有所帮助。