6

我使用维基百科的伪代码在 C++ 中编写了 BFS 的代码。该函数有两个参数 s,t。其中 s 是源节点,t 是目标,如果目标是 fount,则搜索返回目标本身,否则返回 -1。这是我的代码:

#include <iostream>
#include <deque>
#include <vector>

using namespace std;

struct vertex{
vector<int> edges;
bool visited;
};

int dist = 0;

int BFS(vertex Graph[],int v,int target){
deque<int> Q;
Q.push_front(v);
Graph[v].visited = true;
    while(!Q.empty()){
        int t = Q.back();
        Q.pop_back();
            if(t == target){
                return t;
            }
            for(unsigned int i = 0;i < Graph[t].edges.size();i++){
                int u = Graph[t].edges[i];
                if(!Graph[u].visited){
                    Graph[u].visited = true;
                    Q.push_front(u);
                }
            }
    }
    return -1;
} 

int main(){
int n;
cin >> n;
vertex Graph[n];
int k;
cin >> k;
for(int i = 0;i < k; i++){
    int a,b;
    cin >> a >> b;
    a--;
    b--;
    Graph[a].edges.push_back(b);
    Graph[b].edges.push_back(a);
}

for(int i = 0;i < n; i++){
    Graph[i].visited = false;
}

int s,t;
cin >> s >> t;

cout << BFS(Graph,s,t);

  }

我在维基百科上读到这个:

广度优先搜索可用于解决图论中的许多问题,例如:
找到两个节点 u 和 v 之间的最短路径(路径长度由边数 > > 测量)

如何更改我的函数 BFS 以返回从 s 到 t 的最短路径,如果不存在路径则返回 -1?

4

3 回答 3

7

广度优先搜索,顾名思义,先访问距离d起点的所有节点,然后再访问距离为 的任何节点d+1。因此,当您以广度优先顺序遍历图形时,第一次遇到目标节点时,您已经通过最短路径到达那里。

内森·S。答案是正确的,尽管我希望这个答案能提供更多关于它为什么有效的直觉。Paul Dinh 的评论也是正确的;您可以修改内森的答案以跟踪距离而不是实际路径。

于 2012-11-01T04:54:28.823 回答
4

生成新节点时,请跟踪生成该节点的父节点的 id。然后,当你达到目标时,你只需向后追溯父母,直到达到起始状态。例如,您可以将开始标记为它自己的父项,这意味着它是开始状态。或者,只需使用预定义的值 (-1) 来表示没有父级。

因此,在您的代码中,不是将状态标记为已访问,而是有一个父 ID。父 ID 最初可以设置为 -1,然后在更改时更新。父 id 可以只是父图结构中的位置。

于 2012-11-01T04:50:08.110 回答
-1

要获得 BFS 算法的良好实现和解释,请查看此 (CXXGraph)库源代码。

于 2021-07-05T16:30:57.753 回答