BFS (Breadth-First Search)
A graph traversal algorithm that search breadth-first.
インプリメンテーション
こうぞう
ナビゲーションロジック以外のコード
Example I
通常BFSストリームによるコード
//pre-checkがアクセスしたコードを改善し、キュー演算を低減し、コードを簡素化
Example - Shortest Path
すべての幹線の長さが1であると仮定すると、最短距離を求めるのに用いられる
インプリメンテーション
こうぞう
ナビゲーションロジック以外のコード
#include <queue>
#include <vector>
using namespace std;
// by Queue
void BFS(int root = 0, int nodes_size, vector<int> from, vector<int> to)
{
vector<bool> visited(nodes_size, false); // is the node visited?
vector<vector<int>> graph(nodes_size, vector<int>());
queue<int> q;
// init vector<vector<int>> graph
for(int i = 0; i < from.size(); i++)
{
graph[from[i]].push_back(to[i]);
graph[to[i]].push_back(from[i]);
}
// init queue<int> q
q.push(root);
visited[root] = true;
/*
search
*/
}
探索するExample I
通常BFSストリームによるコード
// search
while (!q.empty())
{
int curr = q.front();
q.pop();
if (!visited[curr]/*necessary_conditions*/)
{
visited[curr] = true;
// printf("%d ", curr); // print the process
for (int i = 0; i < graph[curr].size(); i++)
{
int next = graph[curr][i]; // adjacent node
if (!visited[next])
q.push(next);
}
}
}
Example II//pre-checkがアクセスしたコードを改善し、キュー演算を低減し、コードを簡素化
// search
while (!q.empty())
{
int curr = q.front();
q.pop();
// printf("%d ", curr); // print the process
for (int i = 0; i < graph[curr].size(); i++)
{
int next = graph[curr][i]; // adjacent node
if (!visited[next]/*necessary_conditions*/)
{
visited[next] = true;
q.push(next);
}
}
}
活用するExample - Shortest Path
すべての幹線の長さが1であると仮定すると、最短距離を求めるのに用いられる
#include <queue>
#include <vector>
using namespace std;
// assume each length of an edge is 1
void BFS(int start = 0, int nodes_size, vector<int> from, vector<int> to)
{
vector<vector<int>> graph(nodes_size, vector<int>());
vector<bool> visited(nodes_size, false);
vector<int> dist(nodes_size, -1); // distance from start node
queue<int> q;
for(int i = 0; i < from.size(); i++)
{
graph[from[i]].push_back(to[i]);
graph[to[i]].push_back(from[i]);
}
q.push(start);
visited[start] = true;
dist[start] = 0; //
while (!q.empty())
{
int curr = q.front();
q.pop();
for (int i = 0; i < graph[curr].size(); i++)
{
int next = graph[curr][i];
if (!visited[next])
{
visited[next] = true;
dist[next] = dist[curr] + 1; //
q.push(next);
}
}
}
}
Reference
この問題について(BFS (Breadth-First Search)), 我々は、より多くの情報をここで見つけました https://velog.io/@odgh7hk/202203041754テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol