簡體   English   中英

誰能解釋一下這個 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)。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM