广度优先搜索未找到正确路径

Posted

技术标签:

【中文标题】广度优先搜索未找到正确路径【英文标题】:Breadth First Search not finding correct path 【发布时间】:2015-04-26 15:06:46 【问题描述】:

所以我有一个实验室来使用邻接矩阵来实现广度优先搜索和深度优先搜索。要搜索的图的顶点编号为 0-(V-1),因此例如具有 10 个顶点的图的顶点编号为 0-9。每个顶点也被赋予一个值。

在我要给出的例子中,每个顶点的数量等于它的值(例如,顶点 0 的值为 0,顶点 1 的值为 1,等等)。我将每个顶点的值存储在一个数组中,其中位置是顶点,数组中的项目是它的值,因此找到顶点 7 的值如下所示:

value = matrix[7];

我应该编写一个程序,用广度优先搜索找到某个值并报告找到它的顶点,以及找到它需要多少“步骤”。

我的程序在每个测试用例中找到值,但问题是“步骤”不匹配。我认为问题一定出在我的 BFS 算法本身,但我找不到。

例如,我正在以下邻接矩阵中搜索值 7,它位于顶点 7:

0 1 1 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

有10个节点,编号0-9,节点0连接节点1和2,节点1连接节点3和4,节点2连接节点5和6,节点3连接节点7和 8,节点 4 连接到节点 9。

如前所述,“顶点”是顶点值的数组。 “矩阵”是邻接矩阵。 "visited" 是一个 bool 数组,用于跟踪某个顶点是否已被访问。

我正在使用我必须使用的双端队列容器“遍历”图表。

这是我的 BFS:

steps = 1;
int cur_v = 0;
int vertexFound = 0;
bool found = false;
bool *visited = new bool[V];
for (int i = 0; i < V; i++) 
    visited[i] = false;

deque <int> q;
q.push_back(0);
visited[0] = true;
while (!q.empty()) 
    if (found == false) 
        steps++;
    
    cur_v = q.front();
    q.pop_front();
    for (int n = 0; n < V; n++) 
        if (matrix[cur_v][n] == 1) 
            if (visited[n] == false) 
                if (vertices[n] == search) 
                    vertexFound = n;
                    found = true;
                
                visited[n] = true;
                q.push_back(n);
            
        
    
 
if (found == true) 
    cout << steps << endl;

我正在搜索的值是“7”,位于顶点 7。我应该需要 7 步才能到达那里,但我的程序说需要 5。

我遇到的另一个问题是,当我给程序输入应该使它在具有 8 个顶点的图中搜索值 8 时,它告诉我它在顶点处找到了值0 分 9 步。

非常感谢任何帮助!

【问题讨论】:

if (found == false) 不如if (!found);同样,if (found == true) 是一种冗长的说法 if (found) 【参考方案1】:

您不应在第一次找到所需内容后更新vertexFound。 (实际上你可以立即停止搜索。)

【讨论】:

谢谢,我修好了!不幸的是,计数问题没有改变。 您在steps 中计算错误 - 每次从队列中取出某些内容时都会增加它,而不是当您与源的距离增加时。 (如果源有两个邻居,那么这两个邻居都只有 1 步之遥。)您需要做更多的工作来解决这个问题 - 例如记住到每个节点的最短距离。 谢谢!这对我很有帮助,我能够解决它。

以上是关于广度优先搜索未找到正确路径的主要内容,如果未能解决你的问题,请参考以下文章

如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?

如何在广度优先搜索中追踪路径?

深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系?

深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系?

算法图解之广度优先算法

深度优先搜索广度优先搜索