Algorithm 这种基于BFS的算法能在加权图中找到最短路径吗

Algorithm 这种基于BFS的算法能在加权图中找到最短路径吗,algorithm,breadth-first-search,shortest-path,Algorithm,Breadth First Search,Shortest Path,我知道普通BFS搜索可以用于在无权图或具有相同边权的图中查找最短路径,而Dijkstra应该用于加权图,Dijkstra可以看作BFS的一个变体 但是我想知道,如果我每次更新dist[w]时都将节点推送到队列中,而不是在普通的BFS搜索中只推一次,该算法是否可以用于查找最短路径?我在一个leetcode问题上尝试了这个算法,它成功了,但是leetcode问题只检查有限的测试用例,所以我不能证明这个算法的正确性。如果算法正确,时间复杂度是多少 vector<int>dist(N

我知道普通BFS搜索可以用于在无权图或具有相同边权的图中查找最短路径,而Dijkstra应该用于加权图,Dijkstra可以看作BFS的一个变体

但是我想知道,如果我每次更新dist[w]时都将节点推送到队列中,而不是在普通的BFS搜索中只推一次,该算法是否可以用于查找最短路径?我在一个leetcode问题上尝试了这个算法,它成功了,但是leetcode问题只检查有限的测试用例,所以我不能证明这个算法的正确性。如果算法正确,时间复杂度是多少

   vector<int>dist(N + 1, INT_MAX);
        dist[start] = 0;
        queue<int>q;
        q.push(start);
        while(!q.empty()){
            int v = q.front(); q.pop();
            for(auto [w, cost] : g[v]){
              //  cout<<w<<" "<<cost<<endl;
                if(cost + dist[v] < dist[w]){
                    dist[w] = cost + dist[v];
                    q.push(w);
                }
            }
        }
vectordist(N+1,INT_MAX);
距离[开始]=0;
queueq;
q、 推(启动);
而(!q.empty()){
intv=q.front();q.pop();
对于(自动[w,成本]:g[v]){

//cout我相信你已经重新发现了Bellman-Ford算法,减去在负权重循环中失败的必要处理。它应该在O(| V |*| E |)时间内运行(与Dijkstra的O(|V |+| E |)*lg(| V |)时间相反)假设没有负循环,这将在您的实现上无限循环。好的部分是它处理负的边权重,Dijkstra没有。坏的部分是它慢得多


请参见

这不是bellman ford,它只是一个修改过的Dijkstra。您好,您是指SPFA算法,它是bellman ford的改进吗?但是从wikipedia,SPFA将检查更新的节点是否已经在队列中,如果没有,则将其推到队列中,但我的没有检查,所以我的版本仍然有效吗?谢谢dijkstra没有优先级队列,队列表示FIFO,对吗?如果是这样,我认为是Bellman Ford,但没有在规范的wikipedia实现中看到的放松回合的明确分离。当然看起来也像SPFA是的,这可能与Bellman Ford Moore相同,我不确定。该队列确实检查元素是否已经存在在重新添加队列之前先删除它。多次写入队列不会出错-只需降低实现速度。最终仍然会得到正确的答案。这是Dijkstra的一个已知变体。它不再是实际上的Dijkstra。它不再贪婪,你只需将其转换为最短路径算法。你失去了e性能优势,但它可以处理负值。请参阅rontogiannis的答案和答案的注释:@unlut我不认为这是Dijkstra的变体,Dijkstra每次都从未知节点集中提取最短距离,因此它需要一个优先级队列或每次扫描整个距离数组。但基于BFS的版本将节点推送到更新dist时排队。。。