我实现了Bellman-Kalaba的算法,用于在图中找到从顶点1到任何其他顶点的道路的最大值。问题是(虽然很傻),作为函数中的参数传递的第二个二维数组matrixaDrumurilorMaxime[20][20]不会更改任何值,即使我确实为它赋值,或者从另一个数组为它赋值。我确实从文件中初始化了第一个数组matrixaValorilor[20][20],它运行良好。第二个数组刚刚初始化为0,正如您在main函数中看到的那样。我使用的是Visual Studio 2012,可能是IDE的问题?也许有人也有这个问题,可以帮我一点。。。
void bellmanKalaba(int matriceaValorilor[20][20], int dim, int matriceaDrumurilorMaxime[20][20], int &linii, int &coloane)
{
linii = 1;
coloane = dim;
for(int j = 0; j < dim; j++)
{
matriceaDrumurilorMaxime[0][j] = matriceaValorilor[j][dim-1];
}
bool sfarsit = false;
while(sfarsit != true)
{
for(int poz = 0; poz < coloane; poz++)
{
int valMax = 0;
for(int j = 0; j < coloane; j++)
{
if( matriceaDrumurilorMaxime[linii-1][j] + matriceaValorilor[poz][j] > valMax )
valMax = matriceaDrumurilorMaxime[linii-1][j] + matriceaValorilor[poz][j];
}
matriceaDrumurilorMaxime[linii][poz] = valMax;
}
sfarsit = true;
int k = 0;
while(sfarsit == true)
{
if(matriceaDrumurilorMaxime[linii][k] != matriceaDrumurilorMaxime[linii-1][k])
sfarsit = false;
++k;
}
++linii;
}
}
void citireMatriceaValorilorDinFisier(int matriceaValorilor[20][20], int &dimensiune, char* numefisier)
{
int i = 0, j = 0;
dimensiune = 0;
ifstream file(numefisier);
string line;
string element;
size_t pos = 0;
string delimiter = " ";
while(getline(file,line))
{
++dimensiune;
while(pos = line.find(delimiter, 0) != string::npos)
{
pos = line.find(delimiter, 0);
element = line.substr(0,pos);
matriceaValorilor[i][j] = atoi(element.c_str());
line.erase(0, pos+delimiter.length());
++j;
}
++i;
j = 0;
}
file.close();
}
int main()
{
cout << "===Problema ordonantarii: graful potentiale etape===" << endl << endl << endl;
int varfuri = 0;
int matriceValorilor[20][20] = {0};
citireMatriceaValorilorDinFisier( matriceValorilor, varfuri, "Graf.txt");
cout << "Matricea valorilor arcelor:" << endl;
afisareMatrice( matriceValorilor, varfuri, varfuri );
int linii, coloane;
int matriceaDrumurilorMaxime[20][20] = {0};
bellmanKalaba(matriceValorilor, varfuri, matriceaDrumurilorMaxime, linii, coloane);
cout << "Matricea valorilor maxime ale drumurilor de la varful 1 la celelalte varfuri:" << endl;
afisareMatrice( matriceaDrumurilorMaxime, linii, coloane );
//int dimensiune;
//int drumMax[20];
//puncteCritie(matriceaDrumurilorMaxime, varfuri, matriceaDrumurilorMaxime, linii, coloane, drumMax, dimensiune);
//cout << "Punctele critice ale grafului potentiale etape:" << endl;
//afisareVector(drumMax, dimensiune);
cin.get();
return 0;
}
我不确定这是否是您的主要问题,但bellmanKabala
中存在逻辑错误。
启动while(sfarsit != true)
的循环永远无法完成。这是因为它包含启动while(sfarsit==true)
的循环。内部循环一直运行到sfarsit = false
被设置为止。但这意味着外循环将再次运行,并且没有其他break
语句或任何内容。
最终linii
将溢出数组的边界并导致未定义的行为。
除了修复这个错误外,您还可以在++linii
之后添加一个检查,if (linii >= dim)
然后中止并打印一条错误消息,表明出现了问题;而不仅仅是溢出缓冲区。内部循环还应该检查k < dim
。