C++ 我正在尝试使用STL堆栈执行DFS,但它给出了意外的结果
这是我的DFS代码,它应该给出如下输出: 以下是深度优先遍历: 01 3 2 4 但它给出了输出: 以下是深度优先遍历: 0233411 我不再访问访问的元素,但它仍然不工作C++ 我正在尝试使用STL堆栈执行DFS,但它给出了意外的结果,c++,algorithm,graph,depth-first-search,C++,Algorithm,Graph,Depth First Search,这是我的DFS代码,它应该给出如下输出: 以下是深度优先遍历: 01 3 2 4 但它给出了输出: 以下是深度优先遍历: 0233411 我不再访问访问的元素,但它仍然不工作 #include<bits/stdc++.h> using namespace std; void addEdge(vector<int> adj[], int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } voi
#include<bits/stdc++.h>
using namespace std;
void addEdge(vector<int> adj[], int u, int v)
{
adj[u].push_back(v);
adj[v].push_back(u);
}
void DFS(vector<int> adj[], int V, int s)
{
stack<int> st;
bool visited[V];
for(int i=0; i<V;i++)
visited[i] = false;
visited[s] = true;
st.push(s);
while(st.empty()==false)
{
int n=st.top();
st.pop();
visited[n] =true;
cout<<n<<" ";
for(int v:adj[n])
{
if(visited[v]==false)
st.push(v);
}
}
}
int main()
{
int V=5;
vector<int> adj[V];
addEdge(adj,0,1);
addEdge(adj,0,2);
addEdge(adj,2,3);
addEdge(adj,1,3);
addEdge(adj,1,4);
addEdge(adj,3,4);
cout << "Following is Depth First Traversal: "<< endl;
DFS(adj,V,0);
return 0;
}
#包括
使用名称空间std;
无效加法(向量调整[],整数u,整数v)
{
形容词[u]。推回(v);
形容词[v]。推回(u);
}
无效DFS(向量调整[],整数V,整数s)
{
斯塔克街;
布尔访问[V];
对于(inti=0;i,除非有充分的理由使用显式堆栈,否则我建议使用递归(隐式堆栈)。不过,我将修复它,使代码的更改最少
有三件事需要解决,我在下面留下了评论
void DFS(向量调整[],int V,int s)
{
斯塔克街;
向量访问(V,false);//1.不要使用VLA,因为它不是标准的
//2.移除冗余的第一个元件访问标记
圣普什(s);
while(st.empty()==false)
{
int n=st.top();
圣普();
//2.检查是否已访问,因为某些元素可能已添加多次
//(有些被多次推入堆栈,但从未访问过)
如果(已访问[n])
继续;
访问[n]=真;
Cux<代码>向量adj[v]; BoOL访问[V];< /C++ >。C++中的数组必须具有由编译时常数表示的大小,而不是运行时变量。而是使用<代码> STD::向量访问(V);< /COD>和 STD::vector adjv;<代码> >包含< <代码> >使用适当的头文件(S)但是,它不是工作的。它也是不工作的。——你所发布的是无法用ANSI标准C++编译器编译的。我在链接上发布的代码是为那些需要实际构建的程序的人编写的。第二,我不再访问访问的元素——这就是为什么你需要调试你的代码。使用你可能看不到它的代码,代码是完全按照你写的,即使你不是故意这样做。