我需要找到图表的平均最佳路径。我决定使用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;
答案 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
}
}
}