Graph 为什么dfs使用堆栈不能给出正确的结果

Graph 为什么dfs使用堆栈不能给出正确的结果,graph,stack,depth-first-search,Graph,Stack,Depth First Search,我正在使用堆栈打印dfs序列。根据输入和图形的图像,顺序是1 2 4 8 5 6 3 7。但我的代码给出的输出是1 2 4 8 7 6 5 3。有人能解释一下我该怎么修吗 Input: 8 10 1 3 1 2 2 5 2 4 3 7 3 6 4 8 5 8 6 8 7 8 Correct Output: Sequence: 1 2 4 8 5 6 3 7 输入: 8 10 1 3 1 2 2 5 2 4 3 7 3 6 4 8 5 8 6 8 7 8 正确输出: 顺序:1 2 4 8 5

我正在使用堆栈打印dfs序列。根据输入和图形的图像,顺序是1 2 4 8 5 6 3 7。但我的代码给出的输出是1 2 4 8 7 6 5 3。有人能解释一下我该怎么修吗

Input: 8 10 1 3 1 2 2 5 2 4 3 7 3 6 4 8 5 8 6 8 7 8 Correct Output: Sequence: 1 2 4 8 5 6 3 7 输入: 8 10 1 3 1 2 2 5 2 4 3 7 3 6 4 8 5 8 6 8 7 8 正确输出: 顺序:1 2 4 8 5 6 3 7 我的代码:

#include <bits/stdc++.h>
using namespace std;
vector<int>edges[100];
stack<int>q;
vector<int>item;
int level[100],parent[100],visited[100],tn;



void dfs(int s)
{
    int j,k,fr;
    q.push(s);
    level[s]=0;
    for(j=1;j<=tn;j++)
    {
        visited[j]=0;
    }
    visited[s]=1;
    while(!q.empty())
    {
        fr=q.top();
        q.pop();
        item.push_back(fr);
        for(k=0;k<edges[fr].size();k++)
        {
            if(visited[edges[fr][k]]==0)
            {
                 q.push(edges[fr][k]);
                 //cout<<"Pushed="<<fr<<"="<<edges[fr][k];
                 visited[edges[fr][k]]=1;
            }


        }

        //cout<<endl;



    }
}


int main()
{
    int i,e,p,n,u,v,f,m;
    cin>>tn>>e;
    for(i=1;i<=e;i++)
    {
        cin>>u>>v;
        edges[u].push_back(v);
        edges[v].push_back(u);
    }
    dfs(1);
    cout<<"Sequence="<<endl;
    for(m=0;m<item.size();m++)
    {
        cout<<item[m];
    }
    return 0;
}
#包括
使用名称空间std;
向量向量[100];
斯塔克Q;
向量;
int级别[100],父级[100],访问过[100],tn;
无效dfs(整数s)
{
int j,k,fr;
q、 推;
级别[s]=0;

对于(j=1;j而言,在实现中访问的节点的标记包含一个bug;该函数可以重写如下

void dfs(int s)
{
    int j, k, fr;
    q.push(s);
    level[s] = 0;
    for (j = 1; j <= tn; j++)
    {
        visited[j] = 0;
    }
    while (!q.empty())
    {
        fr = q.top();
        q.pop();
        if (0 == visited[fr])
        {
            visited[fr] = 1;
            item.push_back(fr);
            for (k = 0; k < edges[fr].size(); k++)
            {
                q.push(edges[fr][k]);
            }
        }
    }
}
然而,这并不是所期望的解决方案。但是,请注意,如果没有额外的中断规则,该算法允许访问序列中存在一些模糊性。序列

1 2 4 8 7 3 6 5
1 2 4 8 5 6 3 7

可以通过将具有最小id的邻居推到堆栈的最后一个来生成,从而使其在下一次迭代中被访问。

非常感谢@Codor。现在它可以工作了。对于节点8,输入应采用以下格式:7 8-->6 8-->5 8-->4 8