在大多数资源中,BFS的实现是这样的(这是geeks for geeks的实现):
void findpaths(vector<vector<int> >&g, int src,
int dst, int v)
{
// create a queue which stores
// the paths
queue<vector<int> > q;
// path vector to store the current path
vector<int> path;
path.push_back(src);
q.push(path);
while (!q.empty()) {
path = q.front();
q.pop();
int last = path[path.size() - 1];
// if last vertex is the desired destination
// then print the path
if (last == dst)
printpath(path);
// traverse to all the nodes connected to
// current vertex and push new path to queue
for (int i = 0; i < g[last].size(); i++) {
if (isNotVisited(g[last][i], path)) {
vector<int> newpath(path);
newpath.push_back(g[last][i]);
q.push(newpath);
}
}
}
以上实现建议我们首先将邻居添加到队列中,然后再检查它是否是我们的目的地。
但是当将邻居添加到队列中时,我们可以简单地检查邻居是否为目的地(而不是在轮到该节点时检查邻居),尽管这是非常小的改进,但它比最后一个要好。那么为什么每个人都使用以前的方法来实现BFS?