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

2つの特定のノード間にパスが存在するかどうかを確認するC++プログラム


これは、指定された2つのノード間にパスが存在するかどうかを確認するC++プログラムです

アルゴリズム

Begin
   function isReach() is a recursive function to check whether d is reachable to s:
   A) Mark all the vertices as unvisited.
   B) Mark the current node as visited and enqueue it and it will be used to get all adjacent vertices of a vertex.
   C) Dequeue a vertex from queue and print it.
   D) Get all adjacent vertices of the dequeued vertex s.
   E) If an adjacent has not been visited, then mark it visited and enqueue it.
   F) If this adjacent node is the destination node, then return true else continue to BFS.
End

#include <iostream>
#include <list>
using namespace std;
class G {
   int n;
   list<int> *adj;
   public:
      G(int n);
      void addEd(int x, int w);
      bool isReach(int s, int d);
};
G::G(int n) { //constructor 
   this->n = n;
   adj = new list<int> [n];
}
void G::addEd(int x, int w) { //adding edge to the graph
   adj[x].push_back(w); //ad w to x’s list
}
bool G::isReach(int s, int d) {
   if (s == d)
   return true;
   bool *visited = new bool[n];
   //Mark all the vertices as unvisited.
   for (int i = 0; i < n; i++)
      visited[i] = false;
   list<int> queue;
   //Mark the current node as visited and enqueue it and it will be used to get all adjacent vertices of a vertex
   visited[s] = true;
   queue.push_back(s);
   list<int>::iterator i;
   while (!queue.empty()) {
      s = queue.front();
      queue.pop_front(); //Dequeue a vertex from queue and print it
      //If a adjacent has not been visited,
      for (i = adj[s].begin(); i != adj[s].end(); ++i) {
         if (*i == d)
            return true;
         if (!visited[*i]) {
            visited[*i] = true;
            queue.push_back(*i);
         }
      }
   }
   return false;
}
int main() {
   G g(4);
   g.addEd(1, 3);
   g.addEd(0, 1);
   g.addEd(2, 3);
   g.addEd(1, 0);
   g.addEd(2, 1);
   g.addEd(3, 1);
   cout << "Enter the source and destination vertices: (0-3)";
   int a, b;
   cin >> a >> b;
   if (g.isReach(a, b))
      cout << "\nThere is a path from " << a << " to " << b;
   else
      cout << "\nThere is no path from " << a << " to " << b;
   int t;
   t = a;
   a = b;
   b= t;
   if (g.isReach(a, b))
      cout << "\nThere is a path from " << a << " to " << b;
   else
      cout << "\nThere is no path from " << a << " to " << b;
   return 0;
}

出力

Enter the source and destination vertices: (0-3)
There is a path from 3 to 1
There is a path from 1 to 3

  1. C++のバイナリツリー内の任意の2つのノード間のパスのXOR

    この問題では、二分木と二分木の2つのノードが与えられます。私たちのタスクは、2つのノード間のパスにあるすべてのノードのXORを出力することです。 問題を理解するために例を見てみましょう 2から3までのすべてのノードの排他的論理和を見つける必要があります。 2から3、2→6→1→3へのパス。 2 ^ 3 ^ 1^3が見つかります。 出力 − この問題を解決するには、あるノードから別のノードへのパスを見つける必要があります。このために、ルートから両方のノードへのパスにあるすべてのノードのXORを見つけます。これを行う場合、ルートノードからトラバースするときに2つのケースがありま

  2. C++プログラミングのバイナリツリー内の任意の2つのノード間のパスを出力します。

    個別のノードのバイナリツリーと、バイナリツリー内のパスを出力するバイナリツリーの2つのノードが与えられます。 例 −ノード140から211の間のパスを出力して、その出力が次のようになるようにします- Output: 140->3->10->211 アイデアは、ルートノードから2つのノードへのパスを見つけて、それらを2つの別々のベクトルまたは配列(path1とpath2など)に格納することです。 ここで、2つの異なるケースが発生します- 2つのノードがルートノードの異なるサブツリーにある場合 − 2つのノードが、1つが左に、もう1つが右のように異なるサブツリーにあ