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

C ++でBFSを使用して、特定のソースから宛先までのすべてのパスを出力します


この問題では、有向グラフが表示され、幅優先探索(BFS)を使用してグラフのソースから宛先までのすべてのパスを印刷する必要があります。

有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。

問題を理解するために例を見てみましょう-

C ++でBFSを使用して、特定のソースから宛先までのすべてのパスを出力します


ソース=K宛先=P

出力

K -> T -> Y -> A -> P
K -> T -> Y -> P
K -> A -> P

ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。

ソースから宛先までのすべてのパスを印刷するには、グラフをトラバースしてパスを保存してから、有効なパスを印刷する必要があります。

DFSを使用する場合、プロセスは簡単ですが、この場合、実装には少し注意が必要です。

この問題を解決するには、パスを格納するキューが必要になります。ソースノードから開始して、BFSを使用してアレイのトラバースを開始します。トラバース

ツリーを作成し、キューにチェックインします。宛先の頂点に到達した場合は、キュー要素を出力します。それ以外の場合は無視します。

以下のプログラムは解決策をより明確にします-

#include <bits/stdc++.h>
using namespace std;
void printPath(vector<char>& path) {
   int size = path.size();
   for (int i = 0; i < size; i++)
   cout<<path[i]<<" ";
   cout<<endl;
}
int isVertexVisited(char x, vector<char>& path) {
   int size = path.size();
   for (int i = 0; i< size; i++)
   if (path[i] == x)
   return 1;
   return 0;
}
void pathSourceToDestination(vector<vector<char> >&g, char src, char dst, int v) {
   queue<vector<char> > q;
   vector<char> path;
   path.push_back(src);
   q.push(path);
   while (!q.empty()) {
      path = q.front();
      q.pop();
      char last = path[path.size() - 1];
      if (last == dst)
      printPath(path);
      for (int i = 0; i < g[last].size(); i++) {
         if (!isVertexVisited(g[last][i], path)) {
            vector<char> newpath(path);
            newpath.push_back(g[last][i]);
            q.push(newpath);
         }
      }
   }
}
int main() {
   vector<vector<char> > g;
   int v = 4;
   g.resize(4);
   g['X'].push_back('S');
   g['X'].push_back('A');
   g['X'].push_back('N');
   g['A'].push_back('S');
   g['N'].push_back('X');
   g['N'].push_back('A');
   char src = 'N', dst = 'S';
   cout<<"path from src "<<src<<" to dst "<<dst<<" are \n";
   pathSourceToDestination(g, src, dst, v);
   return 0;
}

出力

path from src N to dst S are
N X S
N A S
N X A S

  1. C++で特定のノードから距離kにあるすべてのノードを出力します

    この問題では、二分木、ターゲットノード、整数Kが与えられます。ターゲットノードから距離Kにあるツリーのすべてのノードを印刷する必要があります。 。 二分木 は、各ノードに最大2つのノード(1つまたは2つ/なし)を持つ特別なツリーです。 問題を理解するために例を見てみましょう K =2 ターゲットノード:9 出力 − 5 1 3. 説明 − 距離は、ノードの上位、下位、または同じレベルで取得できます。したがって、それに応じてノードを返します。 この問題を解決するには、ターゲットノードからK距離離れたノードのタイプを理解する必要があります。 上記の試験から、k個の離

  2. 特定のソースから宛先までのすべてのパスをC++で出力します

    この問題では、有向グラフが与えられ、グラフのソースから宛先までのすべてのパスを印刷する必要があります。 有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。 問題を理解するために例を見てみましょう ソース=K宛先=P 出力: K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。 この問題を解決するために、深さ優先探索を使用してグラフをトラバースします。