如何在有向图

时间:2017-06-12 14:08:16

标签: algorithm

我将通过这个例子说明我的问题。 enter image description here 如上所述有向图 至于路径形式 A C 表示(A,C),有三条路径:
A->B->C
A->C A->B->D->C
它们的几何平均值是:
Math.pow(0.1*0.4,1/2)=0.2
Math.pow(0.4,1)=0.4
Math.pow(0.1*0.1*0.8,1/3)=0.2
 显然,最大值为0.4,也就是说最大几何平均路径 A-> C

然后我想要实现的是每两个顶点得到最大几何平均路径。我当前的方法是使用 DFS 来获取每两个顶点的所有路径,然后计算每个路径的几何平均值并获得最大值。
然而顶点数量超过300且图形非常复杂。然后它会在得到结果之前牺牲太多时间。
所以我想知道它有更优雅的算法来更快地解决这个问题。我知道 floyd算法用于多源最短路径。但似乎我不能用这个算法来解决我的问题。对于任何建议,链接或任何相关内容,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

由于几何平均值等于(L_1 L_2 ... L_n)^(1 / n),因此其自然对数等于1 / n *(log(L_1)+ log(L_2)+ ... + log(L_n)。由于log函数是严格单调的,这意味着具有最大几何平均边长条件的路径与具有最大算术平均log(边长)的路径相同。因此,第一个简化是替换每个边长用其对数并重新设置你的条件,搜索最大算术平均边长。当然,任何边长等于0都应该被删除,因为包含这条边的路径永远不会有最大值(除非每条边都有0长度)这种改述并不一定有多大帮助,但它消除了一些人为的(即乍看之下很明显)难度。

接下来,必须处理您希望最大平均边长而不是总边长的事实。在长度为n的所有路径中,具有最大算术平均边长的路径是具有最大总长度的路径。因此,选择具有最大平均边长的路径等同于选择具有最大L_n / n的路径,其中L_n是最大n边缘路径的长度。我没有仔细考虑细节,但在我看来应该可以直接计算L_n(即找到总体最大边长的路径所需的困难,这仍然是NP难的),也许是动态编程。