![](/img/trans.png)
[英]How to find the number of different shortest paths between two vertices, in directed graph and with linear-time?
[英]Find path with maximum cost difference of edges in directed graph in linear-time
有一个有向图G
,其边具有正权重,我们将路径成本定义为具有最小权重和最大权重的边之间的差异。 目标是在其他路径中找到成本最高的路径。 我们不需要只返回最大成本的路径本身。
如果x
是顶点数, y
是边数,则x < 10^5
和y < 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] = -Infinity
和minimumWeigh[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。
为了更好地理解,让我们看一个例子。
最终答案 6 将在计算顶部顶点 DP 时得到。
我希望结果是非常详细和清楚的。 最终时间复杂度为O(|V|+|E|)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.