繁体   English   中英

在线性时间内找到有向图中边的最大成本差异的路径

[英]Find path with maximum cost difference of edges in directed graph in linear-time

有一个有向图G ,其边具有正权重,我们将路径成本定义为具有最小权重和最大权重的边之间的差异。 目标是在其他路径中找到成本最高的路径。 我们不需要只返回最大成本的路径本身。

如果x是顶点数, y是边数,则x < 10^5y < min(x^2,10^5) 时间限制为 1 秒。

基于边界,我认为这个问题必须在O(x+y)时间内解决。

因此,基于问题属性和对其他算法的一些研究,我认为可能的答案可能包含多个DFS (如 SCC 问题)。 我也发现了 Dijkstra 算法的类似问题,可以针对此问题进行修改,但我不太确定复杂度是否合适。 还有一些其他问题与我的类似,但答案是O(m^2)或更高,效率不高。

除了上面提到的以外,我不知道如何解决这个问题,一些见解会很有帮助。 谢谢

解决方案:由于我们的图表可能有循环,这使我们的事情变得复杂。 让我们构建一个新图,在其中我们将强连接的所有组件“压缩”到单个顶点中,因此新图将是非循环的。 在此过程中,让我们记住每个强连接组件的边的最大( maximumWeight[v] )和最小( minimumWeigh[v] )权重。 我们为此花费了O(|V| + |E|)时间,其中|V| 是顶点数, |E| 如果边是计数。

之后让我们以O(|V|+|E|)的时间复杂度对给定的图进行拓扑排序 然后我们来计算简单的DP。

dpMax[v] - 从该顶点到有路径的边的最大权重。 dpMin[v] - 有从该顶点到的路径的边的最小权重。

默认值:如果顶点v是强连通分量,则最大和最小权重已经计算在maximumWeight[v]minimumWeigh[v]中,因此dpMax[v] = maximumWeight[v]dpMin[v] = minimumWeight[v] 否则maximumWeight[v] = -InfinityminimumWeigh[v] = Infinity

按照拓扑顺序,让我们改进每个顶点的 DP:

int answer = -Infinity;
for(auto v : vertexesInTopologicalOrder) {
    int newMinDp = dpMin[v], newMaxDp = dpMax[v];
    for(auto e : v.outgoingEdges) {
        int l = dpMin[v];
        int r = dpMax[v];
        l = min(l, e.weight);
        r = max(r, e.weight);
        l = min(l, dpMin[e.target]);
        r = max(r, dpMax[e.target]);
        answer = max(answer, e.weight - l);
        answer = max(answer, r - e.weight);
        newMinDp = min(newMinDp, l);
        newMaxDp = max(newMaxDp, r);
    }
    dpMin[v] = newMinDp;
    dpMax[v] = newMaxDp;
}

由于我们按拓扑顺序计算 DP,因此已经计算了可实现顶点的 DP。

为了更好地理解,让我们看一个例子。

假设我们有这样一个初始图。 假设我们有这样一个初始图。

压缩后,图形将如下所示。 压缩后,图形将如下所示。

经过拓扑排序后,我们得到了这个顶点顺序。 (绿色数字) 经过拓扑排序后,我们得到了这个顶点顺序。 (绿色数字)

依次计算所有 DP 值,并更新答案。 依次计算所有 DP 值,并更新答案。

最终答案 6 将在计算顶部顶点 DP 时得到。

我希望结果是非常详细和清楚的。 最终时间复杂度为O(|V|+|E|)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM