查找 DAG 中节点值的累积总和

问题描述

假设我有以下有向无环图 (DAG),每个节点的权重为 1。

simple DAG

我感兴趣的是根据其祖先的值计算每个节点的累积总和。假设我之前说过每个节点的权重为1,那么这就是我期望得到的

cumulative sum per node

这就是我尝试做的:

 library(tidygraph,quietly = TRUE) 
 library(tidyverse)
 library(ggraph)

 # create adjacencies
 grafo_df <- tribble(
  ~from,~to,"C","A","B","D","D")
 
 # create the graph
 grafo <- as_tbl_graph(grafo_df)
 
 
 # calculate accumulated sum
 grafo %>% 
  arrange(node_topo_order()) %>% 
  mutate(
   
   revenue = 1,cum_weight = map_dfs(1,.f = function(node,path,...) {
    
    sum(.N()$revenue[c(node,path$node)])
    
   })) %>% 
  as_tibble() %>% 
  unnest("cum_weight")
 
#> # A tibble: 4 x 3
#>   name  revenue cum_weight
#>   <chr>   <dbl>      <dbl>
#> 1 C           1          1
#> 2 A           1          2
#> 3 B           1          2
#> 4 D           1          3

reprex package (v2.0.0) 于 2021 年 5 月 13 日创建

如你所见,D的累加和结果是3而不是4,因为D的值应该是A和B的累加值之和。我不明白为什么D不加4>

我试图理解给定 here 的解决方案,但很难理解它

如何获得累计金额?

更新 #1

我(暂时)不关心算法的复杂性,也就是说,如果算法在 O(V + E) 中执行它,则无关紧要。

this题中提到的重要一点是关于两次计数的问题,即A的值的部分和等于C(1) + A(1) = 2,并且B 的值的部分和等于 C(1) + B (1) = 2,所以说 D 的值不等于 A (2) + B(2) 的部分和,因为C 的值会重复我认为它不适用于这种情况,原因如下:

让我们假设这 4 个节点(A、B、C 和 D)中的每一个都是互联网节点,每个节点产生 1 美元的收入,因此这 4 个节点的总累积收入将为 4 美元。如果 D 是其余节点的收敛节点,那么在 D 停止工作的情况下,其余节点和 D 的收入将不再可能,因此其价值为 4 美元。

更新 #2

如果我添加一条从 C 到 D 的新路径,那么 D 的值应该始终为 4,因为依赖节点的数量是保持不变的,也就是说,重要的是累积总和中的依赖节点数量。例如,在@ThomasIsCoding 提出的解决方案中,如果我添加这个新路径,D 的值现在是 5,我认为部分原因是他们的算法使用度数作为参数来计算累积总和,但是,如果我添加一个附加节点则计算正确。

更新#3

我放置的示例很简单,目的是使目标易于理解,但是,我没有指定它应该可泛化为具有三种不同拓扑的许多节点的图。最外层为树木,中间层为环,最内层为全网状。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)