我正在尝试在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
答案 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倍,这就是输出那么长的原因。