繁体   English   中英

这种基于 BFS 的算法是否适用于在加权图中查找最短路径

[英]Does this BFS-based algorithm work for find shortest path in weighted graph

我知道普通的 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);
                }
            }
        }

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

https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM