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はサイクルに含まれて