C++ 我正在尝试使用STL堆栈执行DFS,但它给出了意外的结果

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

这是我的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);
}

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++编译器编译的。我在链接上发布的代码是为那些需要实际构建的程序的人编写的。第二,我不再访问访问的元素——这就是为什么你需要调试你的代码。使用你可能看不到它的代码,代码是完全按照你写的,即使你不是故意这样做。