プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

グラフの幅優先探索またはBFS


幅優先探索(BFS)トラバーサルはアルゴリズムであり、特定のグラフのすべてのノードにアクセスするために使用されます。このトラバーサルアルゴリズムでは、1つのノードが選択され、隣接するすべてのノードが1つずつ訪問されます。隣接するすべての頂点を完了すると、さらに移動して別の頂点をチェックし、隣接する頂点を再度チェックします。

グラフの幅優先探索またはBFS

このアルゴリズムを実装するには、キューデータ構造を使用する必要があります。隣接するすべての頂点がキューに追加されます。隣接するすべての頂点が完了すると、1つのアイテムがキューから削除され、その頂点を再び通過し始めます。

グラフでは、サイクルが発生することがあるため、配列を使用して、ノードがすでにアクセスされているかどうかをマークします。

入力 -グラフの隣接行列。

A B C D E F
A 0 1 1 1 0 0
B 1 0 0 1 1 0
C 1 0 0 1 0 1
D 1 1 1 0 1 1
E 0 1 0 1 0 1
F 0 0 1 1 1 0

出力 -BFSトラバーサル:B A D E C F

アルゴリズム

bfs(頂点、開始)

入力 −頂点のリストと開始頂点。​​

出力 −グラフが接続されている場合は、すべてのノードをトラバースします。

Begin
   define an empty queue que
   at first mark all nodes status as unvisited
   add the start vertex into the que
   while que is not empty, do
      delete item from que and set to u
      display the vertex u
      for all vertices 1 adjacent with u, do
         if vertices[i] is unvisited, then
            mark vertices[i] as temporarily visited
            add v into the queue
         mark
      done
      mark u as completely visited
   done
End

#include<iostream>
#include<queue>
#define NODE 6
using namespace std;
typedef struct node{
   int val;
   int state; //status
}node;
int graph[NODE][NODE] = {
   {0, 1, 1, 1, 0, 0},
   {1, 0, 0, 1, 1, 0},
   {1, 0, 0, 1, 0, 1},
   {1, 1, 1, 0, 1, 1},
   {0, 1, 0, 1, 0, 1},
   {0, 0, 1, 1, 1, 0}
};
void bfs(node *vert, node s){
   node u;
   int i, j;
   queue<node> que;
   for(i = 0; i<NODE; i++){
      vert[i].state = 0; //not visited
   }
   vert[s.val].state = 1;//visited
   que.push(s); //insert starting node
   while(!que.empty()){
      u = que.front(); //delete from queue and print
      que.pop();
      cout << char(u.val+'A') << " ";
      for(i = 0; i<NODE; i++){
         if(graph[i][u.val]){
            //when the node is non-visited
            if(vert[i].state == 0){
               vert[i].state = 1;
               que.push(vert[i]);
            }
         }
      }
      u.state = 2;//completed for node u
   }
}
int main(){
   node vertices[NODE];
   node start;
   char s;
   for(int i = 0; i<NODE; i++){
      vertices[i].val = i;
   }
   s = 'B';//starting vertex B
   start.val = s-'A';
   cout << "BFS Traversal: ";
   bfs(vertices, start);
   cout << endl;
}

出力

BFS Traversal: B A D E C F

  1. C++での切断されたグラフのBFS

    切断されたグラフ は、1つ以上のノードがグラフの端点ではない、つまり接続されていないグラフです。 切断されたグラフ… 現在、Simple BFSは、グラフが接続されている場合、つまりグラフのすべての頂点にグラフの1つのノードからアクセスできる場合にのみ適用できます。上記の切断されたグラフの手法では、いくつかの法則にアクセスできないため不可能です。したがって、切断されたグラフで幅優先探索を実行するには、次の変更されたプログラムの方が適しています。 例 #include<bits/stdc++.h> using namespace std; void insertnode(v

  2. Facebookグラフ検索用にアカウントのプライバシーを準備する[毎週のFacebookのヒント]

    Facebookが友達についてもっと知るための新機能をリリースするたびに、多くの人々は彼らのプライバシー設定がもはや適切ではないことに気づきます。彼らの最新の新機能であるFacebookGraphSearchも例外ではありません。多くの人は、どのようなものが誰によって見つかるかについて少し心配しています。 ありがたいことに、Facebook Graph Searchがどのように機能するかを少し理解するだけで、それに応じてプライバシー設定を微調整できます。今日は、Facebookグラフ検索とは何か、そして見知らぬ人が私たちについて知ることができるかもしれない種類のことについて少し詳しく説明しま