【问题标题】:Depth first search (C++)深度优先搜索 (C++)
【发布时间】:2014-04-07 04:24:07
【问题描述】:

我创建了一个包含链接列表向量的类。每个链接列表代表我图中的一个顶点。连接到我的链表的节点被认为是这些顶点之间的边。我正在尝试为我的图形创建一个 DFS 函数,但是在设置我的顶点颜色时遇到了麻烦。我意识到我的代码存在很多问题,但我正在尝试特别解决一个问题。我的 DFSit() 函数最终进入无限循环,因为我的列表的颜色属性实际上并未设置为“灰色”。知道为什么会这样吗?

void Graph::DFS()
{
    int i = 0;
    while (i != myvector.size())
    {

        DFSit(myvector[i], myvector[i].val);
        myvector[i].color = "black";
        i++;
    }
}

void Graph::DFSit(AdjList x, int root)
{
if (x.color == "white")
{
    cout << "tree edge ( " << root << "," << x.val << ") " << endl;
}
if (x.color == "gray")
{
    cout << "Back Edge ( " << root << "," << x.val << ") " << endl;
    return;
}

    x.color = "gray";

    AdjNode *temp = new AdjNode();
    temp = x.front;
    int i = 0;
    int value;
    while (temp != NULL)
    {
        value = temp->getValue();
        while (i != myvector.size())
        {
            if (value == myvector[i].val)
            {
                DFSit(myvector[i], root);
            }
            i++;
        }
        temp = temp->next;
    }

}

【问题讨论】:

  • DFSit 传递了项目的副本,因此对它的更改将放入副本中 - 而不是放入真实的副本中。您需要传递一个引用或指向该项目的指针。
  • 如何将 myvector[i] 变成指针?我是否需要先将其设置为指针变量,然后将其传递?

标签: c++ algorithm graph depth-first-search


【解决方案1】:

通常,DFS 规则的正确实现是通过堆栈实现的,但这也可以工作。 我认为您正在为节点AdjList x 着色,并且此着色未保存,因为您通过 val 而不是通过 ref 传递它。 尝试将void Graph::DFSit(AdjList x, int root) 更改为void Graph::DFSit(AdjList&amp; x, int root)

【讨论】:

  • 你可以协助这个 C++ DFS 实现 - link
  • 对不起,你这是什么意思,idanuda?
  • 如果您的实施仍有问题,您可以查看链接中的 DFS 实施并将其与您的实施进行比较。
猜你喜欢
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2016-02-16
相关资源
最近更新 更多