[英]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)。 f
指向隊列的前部(從中提取值),而隊列的后部由r
(將新值添加到隊列中)。
隊列首先是空的,當前頂點v
的鄰居j
被添加到隊列中(在其“后”側)。 當一個頂點j
在隊列中時,它的visit[j]
置為1,否則為0。這是為了防止同一個頂點被兩次添加到隊列中。
從隊列的前面拉下一個頂點。 現在它被認為是訪問過的,所以visited[v]
現在設置為1 並且visit[v]
被清除(這有點矯枉過正,但沒關系)。 同樣,這確保了頂點只被訪問(和輸出)一次。
通過使用隊列,我們可以確保頂點按照與初始頂點的距離(根據邊數)的順序被訪問。
由於有n
個頂點,當外循環迭代n
次時,它們都會被訪問。 這就是k
的重要性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.