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

C++でのソースからターゲットへのすべてのパス


N個のノードを持つ有向非巡回グラフがあるとします。ノード0からノードN-1までのすべての可能なパスを見つけて、それらを任意の順序で返す必要があります。グラフは次のように与えられます。ノードは0、1、...、graph.length-1です。graph[i]は、エッジ(i、j)が存在するすべてのノードjのリストです。

したがって、入力が[[1,2]、[3]、[3]、[]]の場合、出力は[[0,1,3]、[0,2,3]]になります。

これを解決するには、次の手順に従います-

  • resと呼ばれる1つの2D配列を作成します

  • 解決と呼ばれるメソッドを定義します。これにより、グラフ、ノード、ターゲット、および一時配列が取得されます

  • ノードをtempに挿入

  • ノードがターゲットの場合は、tempをresに挿入して戻ります

  • 0からグラフのサイズ[ノード]– 1

    の範囲のiの場合
    • 呼び出しsolve(graph、graph [node、i]、target、temp)

  • mainメソッドから配列tempを作成し、solve(graph、0、size ofgraph-1、temp)

    を呼び出します。
  • 解像度を返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector < vector <int> > res;
   void solve(vector < vector <int> >& graph, int node, int target, vector <int>temp){
      temp.push_back(node);
      if(node == target){
         res.push_back(temp);
         return;
      }
      for(int i = 0; i < graph[node].size(); i++){
         solve(graph, graph[node][i], target, temp);
      }
   }
   vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
      vector <int> temp;
      solve(graph, 0, graph.size() - 1, temp);
      return res;
   }
};
main(){
   vector<vector<int>> v = {{1,2},{3},{3},{}};
   Solution ob;
   print_vector(ob.allPathsSourceTarget(v));
}

入力

[[1,2],[3],[3],[]]

出力

[[0, 1, 3, ],[0, 2, 3, ],]

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

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

  2. C++の無向グラフのすべてのサイクルの長さの積

    入力として無向グラフと無加重グラフが与えられます。タスクは、与えられた中で形成されたサイクルの積を見つけて、結果を表示することです。 例 入力 与えられた図では、8つのノードがあり、そのうち5つのノードが1、6、3、5、8を含むサイクルを形成しており、残りのノードはサイクルに含まれていません。したがって、サイクルの長さは5ノードを含むため5であり、したがって積は5です 与えられた図では、12個のノードがあり、そのうち11個(5 +6)個のノードが、1、6、3、5、8、9、4、10、11、22、12および残りのノードを含むサイクルを形成しています。ノード2はサイクルに含まれて