我在C ++中实现Shortest Path Problem。基本上用户输入SourceVertex
并且函数FindShortestPath(int SourceVertex)
找到并打印从SourceVertex
到所有剩余顶点的最短路径。
void Graph::FindShortestPath(int SourceVertex)
{
cout<<"The shortest paths from "<<SourceVertex<<" are"<<endl;
//initialize the ShortestPathArray
for(int a=0;a<NumberOfVertices;a++)
ShortestPathArray[a]=numeric_limits<int>::max();
ShortestPathArray[SourceVertex]=0;
for(int a=0;a<NumberOfVertices;a++)
{
if(WeightMatrix[SourceVertex][a]!=0)
ShortestPathArray[a]=WeightMatrix[SourceVertex][a];
}
cout<<"Direct Edges Length"<<endl;
for(int a=0;a<NumberOfVertices;a++)
{
cout<<SourceVertex<<"->"<<a<<"="<<ShortestPathArray[a]<<endl;
}
cout<<"Shortest Path after updating"<<endl;
for(int a=0;a<NumberOfVertices;a++)
for(int b=0;b<NumberOfVertices;b++)
if(WeightMatrix[a][b]!=0)//edge exists
{ if(ShortestPathArray[b]>(ShortestPathArray[a]+WeightMatrix[a][b]))
{
ShortestPathArray[b]= ShortestPathArray[a]+WeightMatrix[a][b];}}
for(int a=0;a<NumberOfVertices;a++)
cout<<SourceVertex<<"->"<<a<<"="<<ShortestPathArray[a]<<endl;}
我得到以下输出
The shortest paths from 4 are
Direct Edges Length
4->0=2147483647
4->1=6
4->2=10
4->3=4
4->4=0
Shortest Path after updating
4->0=2147483647
4->1=-2147483645
4->2=-2147483646
4->3=-2147483644
4->4=-2147483647
打印的第一组是正确的。更新部分出现问题。我似乎无法弄清楚这一点。
修改-1
int main(){
Graph g(5);
g.AddEdge(0,4,2);
g.AddEdge(0,2,3);
g.AddEdge(0,1,5);
g.AddEdge(1,3,6);
g.AddEdge(1,2,2);
g.AddEdge(4,3,4);
g.AddEdge(4,1,6);
g.AddEdge(4,2,10);
g.AddEdge(2,1,1);
g.AddEdge(2,3,2);
g.FindShortestPath(4);
return 0;
}
以下是我的输入代码
答案 0 :(得分:1)
if(WeightMatrix[a][b]!=0)//edge exists
{
if(ShortestPathArray[b]>(ShortestPathArray[a]+WeightMatrix[a][b]))
{
ShortestPathArray[b]= ShortestPathArray[a]+WeightMatrix[a][b];
}
}
这里例如,ShortestPathArray的值为a = 0 [a] = 2147483647;即最大范围,在此值中,您将添加更多值,因此它超出范围。 尝试使用比最大限制更小的值。
答案 1 :(得分:0)
这解决了我的问题。
更改
if(WeightMatrix[a][b]!=0)//edge exists
{ if(ShortestPathArray[b]>(ShortestPathArray[a]+WeightMatrix[a][b]))
{
ShortestPathArray[b]= ShortestPathArray[a]+WeightMatrix[a][b];}}
到
if(WeightMatrix[a][b]!=0)//edge exists
{ if(ShortestPathArray[b]>abs(ShortestPathArray[a]+WeightMatrix[a][b]))
{
ShortestPathArray[b]= ShortestPathArray[a]+WeightMatrix[a][b];}}
添加 abs 解决了这个问题。显然,ShortestPathArray
的某些值是负数。如果最初某个值为numeric_limits<int>::max()
,我正在添加一些内容,最终结果包含负值。因此添加abs()函数有帮助。