为什么这段代码在我的机器上显示正确的值时却显示一些垃圾类型的值?
Why is this code showing some junk type of value when it shows the correct value on my machine?
我正在尝试编写实现 Djisktra 算法的代码...但遇到了一些问题
代码的 link 是 Ideone...
当相同的代码在我的电脑上 运行 时,输出结果为
0 4 12 19 21 11 9 8 14
输出一个ideone是
0 4 12 19 21 11 9 8 16777230
看看最后一个元素 14 的区别...我对此一无所知...我的代码中是否有错误?或者它是由于在线编译器的其他原因而发生的,还是我在做一些愚蠢的事情?
此处可能存在错误
int find(int start)
{
int low=INT_MAX,idx=-1,i;
for(i=0;i<V;i++)
if( !(Left[i]) && low>=Distances[i])
{
idx=i;
low=Distances[i];
}
return idx;
}
while(start != -1)
{
for(i = 0; i < V; i++)
if(graph[start][i] && Distances[start] + graph[start][i] < Distances[i])
Distances[i] = graph[start][i] + Distances[start];
start = find(start);
Left[start] = true;
}
我试过找到原因.. V-1 的距离在某个时候是 14(我尝试打印它)但它没有更新后来(我尝试在 V-1 的距离更新时打印它) 不过后来好像没有更新!!
我是初学者,请告诉我哪里出错了
注意:(Graph是一个二维邻接矩阵)Distances是一个int类型的数组,Left是bool类型的)
您在 ideone 上的代码的 while 循环中有未定义的行为,与您在此处发布的代码不匹配。这就是为什么其他人告诫您不提供最小示例的原因。当find
returns-1
、Left[start] = true
访问数组开始前。由于它是未定义的行为,它可以做任何事情,包括在您的 PC 上正常工作和在 ideone 上失败。要修复,因为你在 while 循环之前有一个 Left[start] = true
,删除它,并将它移动到 while 的顶部:
while(start != -1)
{
Left[start] = true;
for(i = 0; i < V; i++)
if(graph[start][i] && Distances[start] + graph[start][i] < Distances[i])
Distances[i] = graph[start][i] + Distances[start];
start = find(start);
}
更正了 ideone 上的代码(还删除了一些未使用的变量)。
我正在尝试编写实现 Djisktra 算法的代码...但遇到了一些问题 代码的 link 是 Ideone... 当相同的代码在我的电脑上 运行 时,输出结果为
0 4 12 19 21 11 9 8 14
输出一个ideone是
0 4 12 19 21 11 9 8 16777230
看看最后一个元素 14 的区别...我对此一无所知...我的代码中是否有错误?或者它是由于在线编译器的其他原因而发生的,还是我在做一些愚蠢的事情?
此处可能存在错误
int find(int start)
{
int low=INT_MAX,idx=-1,i;
for(i=0;i<V;i++)
if( !(Left[i]) && low>=Distances[i])
{
idx=i;
low=Distances[i];
}
return idx;
}
while(start != -1)
{
for(i = 0; i < V; i++)
if(graph[start][i] && Distances[start] + graph[start][i] < Distances[i])
Distances[i] = graph[start][i] + Distances[start];
start = find(start);
Left[start] = true;
}
我试过找到原因.. V-1 的距离在某个时候是 14(我尝试打印它)但它没有更新后来(我尝试在 V-1 的距离更新时打印它) 不过后来好像没有更新!! 我是初学者,请告诉我哪里出错了 注意:(Graph是一个二维邻接矩阵)Distances是一个int类型的数组,Left是bool类型的)
您在 ideone 上的代码的 while 循环中有未定义的行为,与您在此处发布的代码不匹配。这就是为什么其他人告诫您不提供最小示例的原因。当find
returns-1
、Left[start] = true
访问数组开始前。由于它是未定义的行为,它可以做任何事情,包括在您的 PC 上正常工作和在 ideone 上失败。要修复,因为你在 while 循环之前有一个 Left[start] = true
,删除它,并将它移动到 while 的顶部:
while(start != -1)
{
Left[start] = true;
for(i = 0; i < V; i++)
if(graph[start][i] && Distances[start] + graph[start][i] < Distances[i])
Distances[i] = graph[start][i] + Distances[start];
start = find(start);
}
更正了 ideone 上的代码(还删除了一些未使用的变量)。