谁能解释一下这个 BFS 代码是如何工作的?
Can anyone explain me how this BFS code is working?
我是算法和数据结构的新手。此代码来自我错过的 class,现在我很难理解它。在它询问初始顶点后,我无法理解发生了什么。下面是代码
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
int i, j, k, e, n, f, r, v, c[10][10], q[10], visit[10], visited[10];
int main() {
//clrscr();
cout << "Enter number of nodes: ";
cin >> n;
cout << "Enter number of edges: ";
cin >> e;
cout << "enter edge details";
for (k = 1; k <= e; k++) {
cin >> i >> j;
c[i][j] = 1;
}
cout << "enter initials vertex:";
cin >> v;
cout << "\n visited vertices are:" << v << "";
visited[v] = 1;
k = 1;
while (k < n) {
for (j = 1; j <= n; j++)
if ((c[v][j] != 0) && (visited[j] != 1) && (visit[j] != 1)) {
visit[j] = 1;
q[r++] = j;
}
v = q[f++];
cout << v << "";
k++;
visit[v] = 0;
visited[v] = 1;
}
}
q
是BFS典型的队列(先进先出,FIFO)。队列的 front 由 f
指向(这是从中提取值的地方),队列的 rear由 r
指向(新值被添加到队列中)。
队列首先是空的,当前顶点v
的邻居j
被添加到队列中(在它的"rear"端)。当一个顶点j
在队列中时,它的visit[j]
设置为1,否则为0。这是为了防止同一个顶点被两次添加到队列中。
从队列的前面,拉出下一个顶点。现在它被认为是访问过的,所以 visited[v]
现在设置为 1 并且 visit[v]
被清除(这有点矫枉过正,但是没关系)。同样,这确保顶点仅被访问(和输出)一次。
通过使用队列,我们可以确保按照顶点与初始顶点的距离(根据边数)的顺序访问顶点。
由于有n
个顶点,当外层循环迭代n
次时,它们都会被访问。这就是 k
的意义。
我是算法和数据结构的新手。此代码来自我错过的 class,现在我很难理解它。在它询问初始顶点后,我无法理解发生了什么。下面是代码
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
int i, j, k, e, n, f, r, v, c[10][10], q[10], visit[10], visited[10];
int main() {
//clrscr();
cout << "Enter number of nodes: ";
cin >> n;
cout << "Enter number of edges: ";
cin >> e;
cout << "enter edge details";
for (k = 1; k <= e; k++) {
cin >> i >> j;
c[i][j] = 1;
}
cout << "enter initials vertex:";
cin >> v;
cout << "\n visited vertices are:" << v << "";
visited[v] = 1;
k = 1;
while (k < n) {
for (j = 1; j <= n; j++)
if ((c[v][j] != 0) && (visited[j] != 1) && (visit[j] != 1)) {
visit[j] = 1;
q[r++] = j;
}
v = q[f++];
cout << v << "";
k++;
visit[v] = 0;
visited[v] = 1;
}
}
q
是BFS典型的队列(先进先出,FIFO)。队列的 front 由 f
指向(这是从中提取值的地方),队列的 rear由 r
指向(新值被添加到队列中)。
队列首先是空的,当前顶点v
的邻居j
被添加到队列中(在它的"rear"端)。当一个顶点j
在队列中时,它的visit[j]
设置为1,否则为0。这是为了防止同一个顶点被两次添加到队列中。
从队列的前面,拉出下一个顶点。现在它被认为是访问过的,所以 visited[v]
现在设置为 1 并且 visit[v]
被清除(这有点矫枉过正,但是没关系)。同样,这确保顶点仅被访问(和输出)一次。
通过使用队列,我们可以确保按照顶点与初始顶点的距离(根据边数)的顺序访问顶点。
由于有n
个顶点,当外层循环迭代n
次时,它们都会被访问。这就是 k
的意义。