图的平均最佳路径

时间:2013-04-12 04:50:30

标签: c++ algorithm graph average

我需要找到图表的平均最佳路径。我决定使用Floyd-Warhsall的算法来获得所有可能的最佳长度,但所有条目都用零写。关于如何解决这个问题的任何想法?

原始矩阵:

0 0 0 0 1 0
0 0 1 0 4 0
0 1 0 0 0 2
0 0 0 0 0 1
1 4 0 0 0 2
0 0 2 1 2 0

平均代码:

double average = 0;
vector<vector<double> > p;
p = matrix;

for(int k = 0; k < vertices; k++)
{
    for(int i = 0; i < vertices; i++)
    {
        for(int j = 0; j < vertices; j++)
        {
            if((p[i][k] + p[k][j] < p [i][j]))
            {
                p[i][j] = p[i][k]+p[k][j];
            }
        }
    }
}

double sum = 0;

for(int i = 0;i < vertices; i++)
{
    for(int j = 0; j < vertices; j++)
    {
        sum += p[i][j]; //adds up all entries
    }
}

double fact = 0;
for(int i = 1; i < vertices; i++)
{
    fact += i;
}
average = sum/fact;

return average;

1 个答案:

答案 0 :(得分:1)

嗯,所有零的输出都是正确的。

维基百科文章说你的矩阵应该像这样初始化:

 0  inf inf inf  1  inf
inf  0   1  inf  4  inf
inf  1   0  inf inf  2
inf inf inf  0  inf  1
 1   4  inf inf  0   2
inf inf  2   1   2   0

因此,在初始化步骤中,只需将它们设置为INT_MAX。

你得到零,因为当节点之间的权重为零时,这当然是微不足道的解决方案!

编辑:实际上,INT_MAX是一个糟糕的选择,因为你将把它们中的两个加在一起。那是一个溢出。我猜,将它们设置为INT_MAX / 2是安全的。除非您计划权重大于INT_MAX / 2.

#include <cfloat>

for(int i = 0;i < vertices; i++)
{
    p[i][i] = 0; // diagonal should be initialized to zero.
    for(int j = 0; j < vertices; j++)
    {
        if ( i != j && p[i][j]==0)
        {
            p[i][j] = DBL_MAX / 2.0; // As close to infinity as we'll get
        }
    }
}