廣度 首先,Look (BFS) 是一種圖表遍歷計算,用於研究圖表中廣度運動中的中心。 BFS 的正常使用利用線路資訊結構來追蹤即將到來的集線器。無論如何,可以想像在不使用明確線路的情況下利用其他資訊結構來執行 BFS。
在沒有線路的情況下實作 BFS 的一種可選方法是利用兩個叢集或記錄:一個用於正在調查的目前層級的集線器,另一個用於要調查的下一層集線器。起初,目前層級清單包含來源中心。
計算首先強調當前層級清單並轉到每個集線器。對於每個經過的樞紐,其相鄰的樞紐都會受到檢查。如果未存取相鄰的集線器,則將其標記為已存取並新增至其他層級清單。該句柄將繼續進行,直到目前等級清單中的所有集線器都經過為止。
一旦當前級別列表完全遍歷完畢,計算將繼續到另一個級別列表,並重新哈希前往集線器並檢修下一個級別列表的方法。此準備工作將持續進行,直到不再有未訪問的節點為止。
廣度優先方法
BFS 演算法從來源集線器開始,調查其鄰居,最近又轉移到另一個層級的鄰居。使用線路資訊結構來追蹤您造訪的樞紐。在每個週期中,計算都會存取一個集線器,將其標記為已完成,並對未訪問的相鄰集線器進行排隊。此準備工作將持續進行,直到所有可到達的中心都被訪問為止。
程式碼初始化一個向量 adj 來表示圖表的傳染性清單。向量的每個檔案都與一個中心進行比較,每個記錄的值包含相鄰的中心。 BFS 遍歷由 BFS 工作執行,它採用來源集線器、集線器數量 N、經過集線器的向量 vis、單獨的 dp 以及用於追蹤要存取的集線器的向量 v。 bfsTraversal 工作初始化已消失的集線器並刪除向量,然後呼叫 BFS 工作來執行遍歷。
建立圖表的傳染清單表示形式。
初始化一行來儲存要存取的集線器。
初始化消失叢集以追蹤消失節點。
初始化刪除叢集以在每個集線器上儲存從來源集線器刪除的內容。將來源集線器的分隔符號設定為0。
將來源集線器排入佇列並檢查其是否已存取。
雖然管線不可淨化,但請執行以下操作:
#刪除佇列頭部的集線器。對於已出隊且尚未遍歷的每個鄰居集線器,請執行以下操作: 將相鄰集線器排隊。將相鄰的樞紐標記為已存取。將鄰居集線器刪除更新為出隊集線器刪除(也是 1)。
重複步驟 6,直到該行為空。
BFS 遍歷完成後,單獨的叢集將包含從來源節點到圖中所有其他中心的間隔。
(可選)您也可以在 BFS 遍歷中追蹤每個集線器的父集線器,以便以最簡單的方式從來源集線器到所有其他集線器。
#include <iostream> #include <queue> #include <unordered_set> using namespace std; void bfsTraversal(int adjacencyList[][2], int numVertices, int source) { bool visited[numVertices + 1] = {false}; int distances[numVertices + 1] = {0}; queue<int> vertices; vertices.push(source); visited[source] = true; while (!vertices.empty()) { int node = vertices.front(); cout << node << ", "; vertices.pop(); for (int i = 0; i < 2; i++) { int next = adjacencyList[node][i]; if (!visited[next]) { vertices.push(next); distances[next] = distances[node] + 1; visited[next] = true; } } } } int main() { int adjacencyList[][2] = {{0, 0}, {1, 2}, {3, 4}, {0, 0}, {0, 0}}; int numVertices = 4; int source = 2; bfsTraversal(adjacencyList, numVertices, source); return 0; }
2,3,4,0
#include <iostream> #include <vector> using namespace std; void bfsTraversal(vector<vector<int>>& adjacencyList, int N, int source) { vector<bool> visited(N + 1, false); vector<int> distances(N + 1, 0); vector<int> vertices; vertices.push_back(source); visited[source] = true; int curr = 0; while (curr < vertices.size()) { int node = vertices[curr]; cout << node << ", "; for (int i = 0; i < adjacencyList[node].size(); i++) { int next = adjacencyList[node][i]; if (!visited[next]) { vertices.push_back(next); distances[next] = distances[node] + 1; visited[next] = true; } } curr++; } cout << "\nDistances from source " << source << ":\n"; for (int i = 1; i <= N; i++) { cout << "Node " << i << ": " << distances[i] << endl; } } int main() { int N = 8; vector<vector<int>> adjacencyList(N + 1); adjacencyList[0] = {1, 2}; adjacencyList[1] = {2}; adjacencyList[2] = {0, 3}; adjacencyList[3] = {3}; adjacencyList[4] = {5}; adjacencyList[5] = {6, 7}; adjacencyList[6] = {}; adjacencyList[7] = {}; adjacencyList[8] = {}; int source = 5; bfsTraversal(adjacencyList, N, source); return 0; }
5, 6, 7, Distances from source 5: Node 1: 0 Node 2: 0 Node 3: 0 Node 4: 0 Node 5: 0 Node 6: 1 Node 7: 1 Node 8: 0
本文對不使用行資訊結構的廣度優先查找 (BFS) 計算進行了說明。 BFS 計算通常用於從給定的來源中心開始以逐級方式導覽圖表。通常,一條線路用於儲存要前往的樞紐。無論如何,本文研究了一種可選方法,該方法利用基本清單或叢集來儲存下一層的集線器。
這種選擇性的使用完成了圖表的廣度優先研究。本文追溯了 BFS 計算的步驟,例如初始化傳染性記錄、維護 go-to 和分離簇以及使用圓圈來強調中心層級。它還提供了 C 代碼說明,說明了不使用一行的 BFS 遍歷。該程式碼準確地研究圖表,列印 BFS 遍歷排列,並計算從來源集線器到所有其他節點的距離。總的來說,本文在不使用線條的情況下對 BFS 計算進行了清晰的說明和可行的用法,展示了一種以廣度優先的方式導航圖表的可選方法。
以上是廣度優先搜尋不使用隊列的詳細內容。更多資訊請關注PHP中文網其他相關文章!