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