【问题标题】:Why do I need to assign false to each element in BFS but not in DFS为什么我需要为 BFS 中的每个元素而不是 DFS 中的每个元素分配 false
【发布时间】:2021-03-15 08:39:23
【问题描述】:

函数定义为:

// DFS algorithm
void Graph::DFS(int current) {


    visited[current] = true;
    cout<<current << " ";
        

    for (int u : adjLists[current])
        if (!visited[u])
            DFS(u);

}

// BFS algorithm

void Graph::BFS(void){
    
    for(int i=0;i<numVertices;++i)
        visited[i] = false;
        
    list<int> q;
    q.push_back(0);
    visited[0] = true;
    
    while(!q.empty())
    {
        int u = q.front();
        q.pop_front();
        cout<< u << "  ";
        
        for( int i : adjLists[u])
            if(!visited[i]){
                q.push_back(i);
                visited[i] = true;
            }   
    }
}

DFS 工作正常,无需使用 for 循环将访问数组的每个元素分配为等于 false,但 BFS 不是。为什么? 整个程序代码是-https://hastebin.com/ojuyogexof.cpp

【问题讨论】:

  • 对我来说听起来像undefined behaviour。尝试先调用 BFS,然后查看 DFS 是否有效。有时糟糕的程序即使很糟糕也能奏效。这就是未定义行为的工作原理。
  • @john 是的,你是对的,首先调用 BFS DFS 无法正常工作。所以我需要为这两个函数使用 for 循环(但是我怎么能因为 DFS 是递归的)?
  • 您需要有一个函数,通过将访问数组设置为 false 然后调用递归函数来开始深度优先搜索。
  • @john 很好,现在一切都搞定了 :)

标签: c++ algorithm graph depth-first-search breadth-first-search


【解决方案1】:

在调用DFS() 之前,访问的数组从未初始化为fasle,这就是为什么DFS() 的输出只是单个节点(起始节点),即2

整个代码的输出(未将访问数组初始化为 false):

DFS 
2 
BFS
0  2  1  3 

建议:定义一个函数init()函数并在执行DFS()BFS()之前调用它:

#include <bits/stdc++.h>
using namespace std;

class Graph {
    int numVertices;
    list<int> *adjLists;
    bool *visited;

    public:
    Graph(int V);
    void addEdge(int src, int dest);
    void DFS(int vertex);
    void BFS(void);
    void init();
};

// Initialize graph
Graph::Graph(int vertices) {
    numVertices = vertices;
    adjLists = new list<int>[vertices];
    visited = new bool[vertices];
    for(int i=0;i<numVertices;++i){
        visited[i] = false;
    }
}

void Graph::init() {
    for(int i=0;i<numVertices;++i)
        visited[i] = false;
}

// Add edges
void Graph::addEdge(int src, int dest) {
    adjLists[src].push_front(dest);
    adjLists[dest].push_front(src);
}

// DFS algorithm
void Graph::DFS(int current) {
        
    visited[current] = true;
    cout<<current << " ";
        
    for (int u : adjLists[current])
        if (!visited[u])
            DFS(u);

}

// BFS algorithm

void Graph::BFS(void){
    
    list<int> q;
    q.push_back(0);
    visited[0] = true;
    
    while(!q.empty())
    {
        int u = q.front();
        q.pop_front();
        cout<< u << "  ";
        
        for( int i : adjLists[u])
            if(!visited[i]){
                q.push_back(i);
                visited[i] = true;
            }    
    }
}

int main() {
    
    Graph g(4);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 3);


    g.init();
    int start_node = 2 ;
    cout<<"DFS \n";
    g.DFS(start_node) ;

    g.init();
    cout<<endl<<"BFS"<<endl;
    g.BFS();

    return 0;
}

输出:

DFS 
2 3 1 0 
BFS
0  2  1  3 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2015-03-17
    • 2011-08-19
    相关资源
    最近更新 更多