老师,你好。我有个疑问,带负权值的单源最短路径算法,用深度优先算法来实现,是否复杂度会比Bellman-Ford算法更加小呢?
深度遍历部分伪代码如下:
void DFT(int node)
{
//visited为bool数组,标记该节点是否已遍历过,若是,则有负权环
if(visited[node] || hasNegativeCircle)
{
hasNegativeCircle = true;
return;
}
else visited[node] = true;
Graph::Iterator iter(graph, node);
//遍历该节点所有边
for(auto e = iter.begin(); !iter.end(); e = iter.next())
{
int other = e->other(node);
//这里的from是int数组,标识该节点的前一个节点,-1为初始值
//若满足松弛条件,则往下搜索该节点
if(-1 == from[other] || distTo[other] > distTo[node] + e->wt())
{
from[other] = node;
distTo[other] = distTo[node] + e->wt();
DFT(other);
}
}
//递归返回时,应将该节点标记为未访问
visited[node] = false;
}
根据邻接表图的遍历,复杂度应该是O(V + E),比O(VE)小。用教程上的测试用例也能跑过。只是不知道是否有其他的缺陷存在,能否请老师帮忙分析一下呢?谢谢!