c ++深度优先搜索(DFS)显示错误的结果

时间:2018-11-23 20:19:13

标签: c++ graph

我正在尝试在c ++中实现深度优先搜索(DFS),但未显示正确的输出。 已经访问过的节点不应再出现,而且应该不止一次出现,我真的不知道为什么会这样,所以任何帮助都将不胜感激。

代码

#include <iostream>
#include <vector>

using namespace std;

struct Node{
    int id;
    vector<Node> adj;
    bool visited;
};

struct Graph{
    vector<Node> nodes;
};

void addEdge(Graph& g,int ida,int idb){
    g.nodes[ida].adj.push_back(g.nodes[idb]);
    g.nodes[idb].adj.push_back(g.nodes[ida]);
}

void dfs(Graph& g,Node& n){
    n.visited = true;
    cout << n.id << endl;
    for (int i = 0;i < n.adj.size();i++)
        if (!n.adj[i].visited)
            dfs(g,n.adj[i]);
}

void init(Graph& g,int n){
    g.nodes.clear();
    for (int i = 0;i < n;i++){
        Node v;
        v.id = i;
        v.visited = false;
        g.nodes.push_back(v);
    }
}

int main()
{
    Graph g;
    init(g,5);
    addEdge(g,1,3);
    addEdge(g,0,4);
    addEdge(g,1,4);
    addEdge(g,2,1);
    for (int i = 0;i < g.nodes.size();i++)
        dfs(g,g.nodes[i]);
    return 0;
}

我认为应该是输出

0 4 1 3 2

实际输出

0 4 1 3 4 0 4 2 1 3 4 0 4 2 1 3 4 0 4 3 1 3 4 0 4 1 3 4 0 4

2 个答案:

答案 0 :(得分:2)

您要使用Node而不是指向节点的指针来存储邻接列表。

vector<Node*> adj;

g.nodes[ida].adj.push_back(&(g.nodes[idb]));
g.nodes[idb].adj.push_back(&(g.nodes[ida]));

当然,这仅在您按下图上的所有节点后进行邻接时才有效。

当您检查邻接表!n.adj[i].visited上的标志时,这是在节点的副本上完成的,而不是在您已经访问过的节点上完成的。

此外,您应该正确初始化visited

答案 1 :(得分:-1)

您只需要调用一次df即可获得所需的输出(按长度计)。您称其为5倍,这就是输出那么长的原因。