我实施了Bellman-Kalaba的算法,用于在图表中找到从顶点1到任何其他道路的最大道路值。 问题是(虽然很傻),第二个二维数组 matriceaDrumurilorMaxime [20] [20] 在函数中作为参数传递,不会改变任何值 ,即使我确实给它赋值,或者从另一个赋值给它。我从文件初始化第一个数组 matriceaValorilor [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;
}
答案 0 :(得分:0)
我不确定这是否是您的主要问题,但bellmanKabala
中存在逻辑错误。
循环开始while(sfarsit != true)
永远无法完成。这是因为它包含从while(sfarsit==true)
开始的循环。内循环运行直到设置sfarsit = false
。但这意味着外部循环将再次运行,并且没有其他break
语句或任何内容。
最终linii
将溢出数组的边界并导致未定义的行为。
除了修复此错误之外,您还可以在++linii
之后添加一个检查if (linii >= dim)
然后中止并打印错误消息,表明出现了问题;而不只是溢出缓冲区。内部循环还应该检查k < dim
。