嗯,我的代码确实还有不严谨的地方。在这种情况下提示“存在负权环”确实是不对的。我们的检验负权环的代码应该是基于整个图是已经联通的情况下进行的。这也是为什么我们的最短路径算法例存在 bool hasPathTo( int w ) 这个接口。我们在检查最短路径前,应该首先查看是否存在从源点到这个点的路径。为此,我在我的代码上在查找最短路径前,assert了首先需要有路径。
// 返回从s点到w点的最短路径长度
Weight shortestPathTo( int w ){
assert( w >= 0 && w < G.V() );
assert( hasPathTo(w) );
assert( !hasNegativeCycle );
return distTo[w];
}
for( int i = 1 ; i < V ; i ++ ) {
if (bellmanFord.hasPathTo(i)) { // 首先要确保有通路
cout << "Shortest Path to " << i << " : " << bellmanFord.shortestPathTo(i) << endl;
bellmanFord.showPath(i);
}
else
cout << "No Path to " << i << endl;
cout << "----------" << endl;
}