C++ Dijkstra算法C++;输出错误
我之前的问题得到了回答,但我想知道如何修改它以显示最低路线经过的十字路口?谢谢 注意:driverMap是一个2D 14x14整数向量,它包含到达每个顶点所需的距离C++ Dijkstra算法C++;输出错误,c++,algorithm,dijkstra,C++,Algorithm,Dijkstra,我之前的问题得到了回答,但我想知道如何修改它以显示最低路线经过的十字路口?谢谢 注意:driverMap是一个2D 14x14整数向量,它包含到达每个顶点所需的距离 void startFirst(vector< vector<int> > driverMap, vector<Car> allCars, int congestFactor) { clock_t start = clock(); int Intersections[driverM
void startFirst(vector< vector<int> > driverMap, vector<Car> allCars, int congestFactor)
{
clock_t start = clock();
int Intersections[driverMap.size()];
int Distances[driverMap.size()];
for(int i = 0; i < driverMap.size(); i++)
{
Intersections[i] = i;
}
for(int i = 0; i < driverMap.size(); i++)
{
cout << "Intersection '" << i << "': ";
for(int k = 0; k < driverMap.size(); k++)
{
cout << driverMap[i][k] << "|";
}
cout << endl;
}
for(int i = 0; i < 1; i++)
{
int startInt = allCars[i].getStart();
Intersections[startInt] = -1;
Distances[startInt] = 0;
for (int i = 0; i < driverMap.size(); i++)
{
if(i != startInt)
{
Distances[i] = driverMap[startInt][i];
}
}
cout << "FOR INTERSECTION: '" << startInt << "'" << endl;
cout << endl;
for (int l = 0; l < driverMap.size(); l++)
{
if(l != startInt)
{
Dijkstra(driverMap, Intersections, Distances);
}
}
for (int k = 0; k < driverMap.size(); k++)
{
cout << Distances[k] << "|";
}
}
cout << "Total time simulated: " << (clock() - start ) / (double) CLOCKS_PER_SEC << endl;
}
void Dijkstra(vector< vector<int> > driverMap, int Intersections[], int Distances[])
{
int minValue = 9999;
int minNode = 0;
for (int i = 0; i < driverMap.size(); i++)
{
if (Intersections[i] == -1)
{
continue;
}
if (Distances[i] > 0 && Distances[i] < minValue)
{
minValue = Distances[i];
minNode = i;
}
}
Intersections[minNode] = -1;
for (int i = 0; i < driverMap.size(); i++)
{
if (driverMap[minNode][i] < 0)
{
continue;
}
if (Distances[i] < 0)
{
Distances[i] = minValue + driverMap[minNode][i];
continue;
}
if ((Distances[minNode] + driverMap[minNode][i]) < Distances[i])
{
Distances[i] = minValue + driverMap[minNode][i];
}
}
}
void startFirst(向量driverMap,向量allCars,int-factor)
{
时钟启动=时钟();
int交叉点[driverMap.size()];
int距离[driverMap.size()];
对于(int i=0;i 参见下面C语言中的Dijkstra算法:
您的问题是:假设不正确。您的假设不正确,因为从5到4没有直接的访问权限。
您所声称的是,从5到0的距离是路径5-4-0
,距离4800
(2600+2200)。
但是,事实上,您只能通过距离5200
(1500+1500+2200)的代码获取路径5-8-4-0
请注意,交叉口5中的距离2600
用于交叉口3,而不是交叉口4。您从索引0开始,而不是1。手动绘制下图支持@hk6279的答案。
从“13”到达时,无法获得到“0”的最佳路径。
它应该是从“1”或“4”到“0”,如@hk6279所述,并且程序正确计算,最佳路径是距离5200的“5”-“8”-“4”-“0”
对不起,这不利于我的问题,因为我使用C++,我不明白为什么我的输出是错误的。哦,我的上帝,我所做的只是一个桌面检查错误?@杰克逊科林斯对代码的唯一关注是<代码> int MINVALY=9999;int min Noint=0;< /Cord>。对于minNode的minValue和non exist node,比如-1。好的,谢谢您的帮助,但是什么才是足够大的值呢?@JacksonCollins足够大的值通常表示Integer.MAX_值(对于java,对于C++),这是数据类型允许的最大值。您也可以使用始终大于任何距离的值[i] 对于任何可能的输入。它有助于防止在需求更改时出现潜在错误,如面对案例距离[i]>=10000
。嘿,你知道我如何更改此选项以保存最短距离的路线及其经过的交叉口吗?谢谢你的精美图纸。请帮助编辑我的名字“hk6279”,而不是“kh6219”在你的帖子里。画得很好,谢谢。我计算错了我的预期结果。你有没有可能给我们一个答案?