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

Breadth First Search not finding correct path

本文关键字:路径 广度优先搜索      更新时间:2023-10-16

所以我有一个实验室来使用邻接矩阵实现广度优先搜索和深度优先搜索。要搜索的图的顶点编号为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数组,用于跟踪顶点是否已被访问。

我正在使用一个deque容器"遍历"图形,这是我必须使用的。

这是我的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步。

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

非常感谢您的帮助!

您不应该在第一次找到要查找的内容后更新vertexFound。(事实上,你可以立即停止搜索。)