如何更快计算双向连通节点间最大路径值的总和?
高效解决方案思路
首先明确问题核心:我们需要计算任意两点间路径乘积(节点值 × 路径衰减乘积)的最大值,再统计每个节点到所有其他节点的该值之和。暴力遍历(每个节点DFS/BFS)时间复杂度太高,下面是几种更高效的实现方案:
1. 变种Floyd-Warshall算法(适合稠密图)
如果你的图是稠密的(节点间边较多),可以用修改版的Floyd-Warshall直接计算任意两点的最大衰减乘积:
- 初始化一个N×N的矩阵
max_prod:max_prod[i][j]= 节点i到j的直接边衰减值(如果i和j相连);题目说明图是双向连通的,无需处理不连通情况max_prod[i][i] = 1(自身到自身的衰减乘积为1)
- 状态转移:对每个中间节点k,更新所有i,j的
max_prod[i][j] = max(max_prod[i][j], max_prod[i][k] * max_prod[k][j]) - 最终,节点i到j的最大路径值 =
节点i的数值 × max_prod[i][j] - 时间复杂度O(N³),实现简单,适合N≤500的场景。
2. 变种Dijkstra算法(适合稀疏图)
如果图是稀疏的(边数远小于N²),把问题转化为最短路径问题处理更高效:
- 对每条边的衰减值w(0<w<1),计算转换后的权重
weight = -ln(w)(ln(w)为负数,转换后权重为正数) - 对每个起点s,用Dijkstra算法求s到所有节点t的最短路径长度d(s,t),对应的最大衰减乘积就是
exp(-d(s,t)) - 节点s到t的最大路径值 =
节点s的数值 × exp(-d(s,t)) - 时间复杂度O(N*(E log N)),稀疏图下比Floyd-Warshall快很多,适合N较大的场景。
3. Johnson算法(稀疏图进阶优化)
如果需要进一步优化稀疏图的全源路径计算,Johnson算法是更好的选择:
- 同样先把边权转换为
-ln(w)的正数形式 - 通过添加虚拟节点重新赋权,统一处理后对每个节点跑一次Dijkstra
- 时间复杂度O(N E log N),比逐个跑Dijkstra的常数更小,适合节点数较多的稀疏图。
最后统计总和
得到所有点对的最大路径值后,对每个节点i,遍历所有j≠i,累加i到j的最大路径值即可得到该节点的总和。
内容的提问来源于stack exchange,提问作者noodle_run
相关产品推荐
相关产品推荐

