我正在尝试编写一个用于实现Djisktra算法的代码......并且遇到了一些问题 代码的链接是Ideone ... 当在我的PC上运行相同的代码时,输出结果为
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的距离更新时打印它)但是好像以后没有更新!! 我是初学者请告诉我哪里出错了 注意:(图形是2D邻接矩阵)距离是int类型的数组,Left是bool类型的数据)
答案 0 :(得分:1)
您在ideone上的代码中的while循环中有未定义的行为,它与您在此处发布的代码不匹配。这就是为什么其他人告诫你没有提供一个最小的例子。当find
返回-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上的代码(也删除了一些未使用的变量)。