【问题标题】:Depth-First-Search terminating prematurely深度优先搜索过早终止
【发布时间】:2014-12-24 03:18:31
【问题描述】:

this question 中,我问了一些关于实现我自己的图形创建数据结构的问题。现在它终于开始工作了,我正在实施基本的 DFS 和 BFS。我的 BFS 正在使用我自己创建的队列类。但是,我的 DFS 无法正常工作,我似乎无法弄清楚原因。它仅适用于从第一个节点开始并找到第一个相邻节点(“USA”)。任何其他组合都返回 NULL 指针(因此没有“真正的”运行时错误)。下面是代码,我删除了不相关的例程和已经工作的内容。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

template<class T>
class Node{
    T data;
    vector<Node<T>*> adjacent;
    public:
        bool visited;
        int n;
        Node(T initData) : data(initData), visited(false),n(0){}
        void addAdjacent(Node<T>& other){//call from within GraphCl class. push_back in adjacent}
        T getData(){return data;}
        Node<T>* getEdge(int edgeNum){return adjacent[edgeNum];}
};

template<class T>
class GraphCl{
    int n;
    vector<Node<T>*> nodes;
    public:
        GraphCl(int size=0): n(size) {//[...]}
        ~GraphCl(){//[...]}
    void addNode(T input){//push_back new node to nodes vector}
    void addEdge(int baseNode, int edgeNode){//push_back edgeNode adres in adjacent vector}
    Node<T>* getNodeAddress(int idx){return nodes[idx];}
};

template<class T>
Node<T>* dfs(Node<T>* rootNode, T key){
    if(rootNode->visited == false){
        rootNode->visited = true;
        if (rootNode->getData() == key){
            return rootNode;
        }
        for(int i=0;i<rootNode->n;i++){
            if(dfs(rootNode->getEdge(i),key) != NULL){
                return dfs(rootNode->getEdge(i),key);
            }
        }
    }
    return NULL;
}

int main(){
    GraphCl<string> *myGraph = new GraphCl<string>();
    myGraph->addNode("USA");//0
    myGraph->addNode("Australia");//1
    myGraph->addNode("The_Netherlands");//2
    //more nodes added here ...
    myGraph->addNode("Indonesia");
    myGraph->addNode("Canada");
    myGraph->addNode("Czech_Republic");
    myGraph->addEdge(0,1);
    myGraph->addEdge(0,4);
    myGraph->addEdge(2,10);
    //more edges added here ...
    myGraph->addEdge(3,1);
    myGraph->addEdge(11,12);
    myGraph->addEdge(6,11);
    Node<string> *rootNode = myGraph->getNodeAddress(4);
    cout << dfs<string>(rootNode, "USA")->getData();
    return 0;
}

DFS 功能是否存在可以立即发现的严重问题?想不通。

【问题讨论】:

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


    【解决方案1】:

    这就是问题所在:

    if(dfs(rootNode->getEdge(i),key) != NULL){
                    return dfs(rootNode->getEdge(i),key);
                }
    

    您在同一节点上两次调用dfs。第二次调用它时,rootNode-&gt;visited 将是真的。在这种情况下,您的代码将返回 NULL。要修复它,请将 if 块更改为

    Node<T>* val = dfs(rootNode->getEdge(i),key);
    if(val != NULL){
                        return val;
                    }
    

    【讨论】:

    • 谢谢!完全想不通。盯着看的时间。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多