Algorithm 带更新的节点加权DAG和最长路径

Algorithm 带更新的节点加权DAG和最长路径,algorithm,directed-acyclic-graphs,Algorithm,Directed Acyclic Graphs,假设您有一组可以并行完成的作业。每个作业都有时间要求(第i个作业的时间要求为t_i)。还有一些依赖性,其中第i个说你必须在工作之前先做工作。你必须尽量减少所需的总时间 通过将这些关系转换成一个有向无环图,然后使用它来确定哪些关系是并行的,可以很容易地做到这一点 如果我不清楚,这里有一个例子。假设你有5份工作,时间要求是2,9,3,12,5,你必须在5之前做3份,在5之前做4份,在1之前做3份,在2之前做1份。那么你最多只能做17个。这是你的dag: +---> 1 (2) --->

假设您有一组可以并行完成的作业。每个作业都有时间要求(第i个作业的时间要求为t_i)。还有一些依赖性,其中第i个说你必须在工作之前先做工作。你必须尽量减少所需的总时间

通过将这些关系转换成一个有向无环图,然后使用它来确定哪些关系是并行的,可以很容易地做到这一点

如果我不清楚,这里有一个例子。假设你有5份工作,时间要求是2,9,3,12,5,你必须在5之前做3份,在5之前做4份,在1之前做3份,在2之前做1份。那么你最多只能做17个。这是你的dag:

+---> 1 (2) ---> 2(9)
|
3 (3)
|
+----> 5 (5)
       ^
       |
4 (12)-+
您可以并行地执行3和4,这样您在执行5之前最多花费(3,12)=12个时间单位,这需要5个时间单位。因此,5是在17个时间单位后完成的。另一方面,2在14个单元后完成。所以答案是17

问题是,在每个查询中是否只更新了一次时间需求(每次从原始图形开始,而不是之前修改后生成的图形) 如何有效地找到新的最短时间要求


对于那些想要约束的人,作业数时间要求是无环有向图中路径的最大权重。对于每个节点,两次线性时间遍历产生以该节点结束的路径的最大权重和以该节点开始的路径的最大权重。现在我们可以找到包含指定节点的路径的最大长度。如果一个节点的权重增加,那么我们取该节点上一个最大值和新的最大值中的最大值,我们可以在恒定时间内计算

减少更为棘手,因为对于最大权重路径中的每个节点,我们需要不包括该节点的路径的最大权重。我能想到的第一种方法(也许不是最好的)是以下方法。向非循环有向图中添加一个源和一个接收器,两个都具有零权重,并且连接到(源)或从(接收器)其他每个节点。按拓扑顺序对节点编号,其中源为0,汇为n+1,并初始化将节点映射到路径权重的段树,其中初始值为-无穷大。此段树具有以下对数时间操作

Weight(i) - returns the value for node i
Update(i, j, w) - updates the value for nodes i..j to
                  the maximum of the current value and w
对于从
i
j
的每个弧,调用
更新(i+1,j-1,w)
,其中
w
是包含从
i
j
的弧的路径的最大权重。最后,段树中的每个权重是不包括相应节点的路径的最大权重


(关于运行时间的说明:通过单独处理没有依赖关系的节点,可以使此方法的运行时间为O(m log n+n+q),其中n是节点数,m是依赖项数,q是查询数。我的分段树排序是计算3D最大值,这是计算几何学家研究的一个问题。对于预排序输入(至少在二维),已知的n个点的最快算法是O(n log n),通过van Emde Boas树。在某些情况下,也存在输出敏感时间界限优于最坏情况界限的算法。)

这是某在线编程法官提出的问题吗?如果有问题的话,请给我问题的链接。我不知道;这个问题出现在今天的IOI选择测试(印度)第2天。虽然我没有具体说明,但这个问题只要求增加。这似乎是一种奖励。非常感谢您的明确解释D