Breadth First Search幅を優先的に参照
Breadth First Search幅を優先的に参照
ルートノードまたは任意のノードから、まず隣接ノードのグラフィックナビゲーション方法を参照します.
これは,まず開始頂点に近い頂点を探索する方法である.
そのため、深さというより広さです.
このメソッドは、最短パスまたは任意のパスを検索するときに使用します.
void Bfs(int here)
{
// 루트노드를 push하여 탐색 "예약"을 해준다.
queue<int> q;
q.push(here);
discovered[here] = true;
while (q.empty() == false)
{
// 가장 우선순위로 예약된 노드부터 탐색을 시작한다.
here = q.front();
// 탐색이 실행될 것이니 예약 순위에서 제거한다.
q.pop();
cout << "Visited: " << here << endl;
for (int there : adjacent[here])
{
// 이미 방문한 노드라면 다시 방문하지 않는다.
if (discovered[there])
continue;
// 방문한적 없는 노드라면
// 해당 노드에 대한 탐색을 예약한다.
q.push(there);
// 노드 방문 여부를 true로 처리한다.
discovered[there] = true;
}
}
}
void BfsAll()
{
// 서로 연결이 안된 정점을 탐색하기 위함
for (int i = 0;i < 6;i++)
{
if (discovered[i] == false)
Bfs(i);
}
}
「予約」のように、スタートに近い頂点をpushで検索します.
アクセスした場合は、discoveryをtrueに設定して無限ループを防止します.
Queueの先入先出特徴を用いて所定の順序で探索する.
いくつかのセグメントコードを追加すると、自分のノードを発見する情報と、開始点からの距離についても理解できます.
void Bfs(int here)
{
// 누구에 의해 발견 되었는지?
vector<int> parent(6, -1);
// 시작점에서 얼만큼 떨어져 있는지?
vector<int> distance(6, -1);
queue<int> q;
q.push(here);
discovered[here] = true;
parent[here] = here;
distance[here] = 0;
while (q.empty() == false)
{
here = q.front();
q.pop();
cout << "Visited: " << here << endl;
for (int there : adjacent[here])
{
if (discovered[there])
continue;
q.push(there);
discovered[there] = true;
parent[there] = here;
distance[there] = distance[here] + 1;
}
}
}
Reference
この問題について(Breadth First Search幅を優先的に参照), 我々は、より多くの情報をここで見つけました https://velog.io/@sansam41/BFS-Breadth-First-Search-너비-우선-탐색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol