Algorithm DFS-在图中查找最小生成树

Algorithm DFS-在图中查找最小生成树,algorithm,graph,Algorithm,Graph,l-辐射列表 x-起始顶点 dfst,q-顶点大小的空数组 std::list <int> q; std::vector<bool> visited(cols + 1); for(int i = 0; i < cols; i++) visited[i] = false; visited[x] = true; if(!l[x].empty()) for(std::list<int>::iterator i = l[x].begin(); i != l[x

l-辐射列表
x-起始顶点
dfst,q-顶点大小的空数组

std::list <int> q;
std::vector<bool> visited(cols + 1); 
for(int i = 0; i < cols; i++) visited[i] = false;
visited[x] = true;
if(!l[x].empty())
for(std::list<int>::iterator i = l[x].begin(); i != l[x].end(); i++)
{
    q.push_back(x); q.push_back(* i);
}
while(!q.empty())
{
    y = q.back(); q.pop_back();
    x = q.back(); q.pop_back();
    if(!visited[y])
    {
        visited[y] = true;
        if(!l[y].empty())
        for(std::list<int>::iterator i = l[y].begin(); i != l[y].end(); i++)
        {
            q.push_back(y); q.push_back(* i);
        }
        dfst[x].push_back(y);
        dfst[y].push_back(x);
    }
}
std::list q;
std::访问的病媒(cols+1);
对于(int i=0;i
我只是不明白为什么这会给出错误的结果…我不知道你是否熟悉这个算法,但如果你熟悉,我希望你能看到这里的错误

编辑:

邻接列表为:
1:2,3
2:3
3:4
4:3

MST在这里应该是这样的:
1:2,3
3:4

但事实是:
2:3
3:2,4
4:3

目前的代码是:(我在需要的地方用括号):

std::list q;
std::访问的病媒(cols+1);
对于(int i=0;i
代码看起来有点让人困惑,实际上我认为它是BFS第一个..但它是DFS 在添加到堆栈(列表的后面)之前,应该检查是否访问了节点

while(!q.empty())
{
y=q.back();q.pop_back();
x=q.back();q.pop_back();
如果(!已访问[y])
{
访问[y]=真;
如果(!l[y].empty())
for(std::list::迭代器i=l[y]。begin();i!=l[y]。end();i++)
{
如果(!访问[*i])
{q.push_back(y);q.push_back(*i);}
}
dfst[x]。推回(y);
dfst[y]。推回(x);
}
}

我仔细检查了您的代码,它似乎是正确的。但是,请记住,如果输入树有一个循环,则有多个DFS树。得到的树取决于处理顶点的顺序。也许你的输入有一个循环?如果是这样,您的代码处理节点的顺序可能与在解决方案中处理节点的顺序不同

例如,以输入树的以下邻接列表为例,其中节点为字母:

a: b,c
b: a,d
c: a,c,e
d: b,c,e
e: c,d
从a开始,如果我们根据字母顺序在邻接列表中查找下一个节点,我们将得到以下DFS树:

a: b
b: a,d
c: d,e
d: b,d
e: c
但是,使用您的算法,我们得到以下结果:

a: c
b: d
c: a,e
d: b,e
e: c,d
如果发生这种情况,也许可以尝试递归方法

看到一些示例输入和输出将有助于进一步回答这个问题,因为这可能不是您的问题

编辑:我应该澄清,具有循环的图中的多个DFS树适用于循环是双向的,例如无向图。关键是,您可能会发现一个DFS树也是正确的,但与已标识为正确的DFS树不同


编辑(再次):您可能遇到的另一个问题:您的算法似乎适用于无向图,因为您具有语句
dfst[x]。向后推(y);dfst[y]。推回(x)
在代码中,但示例中给出的输入图看起来像是定向的。删除第二条语句(
dfst[y]。push_back(x);
)应该可以纠正这一问题。

使用括号来排列代码。我怀疑if语句是否能达到您的目的。一个最小的完整示例和一个更明确的“错误结果”描述会不会太过分?好的,我写了一些示例数据,并对代码进行了一些重构。我刚刚看到了这些,并编辑了输出-但现在更奇怪了。4,因为有4个顶点。这应该是
if(!visited[*i])
在for循环中。但这不会改变结果,只会提高效率。@user2489034您找到解决方案了吗?只是检查一下,在看到您的第二次编辑之前,我失去了希望-删除第二行有效:D谢谢!
a: b
b: a,d
c: d,e
d: b,d
e: c
a: c
b: d
c: a,e
d: b,e
e: c,d