//图算法
//题目:
//给定一个有向图,找出从起始节点到终止节点的所有路径。
//
//问题函数定义:
//
//cpp
//vector<vector<int>> findAllPaths(vector<vector<int>>& graph, int start, int end);
//裁判测试程序样例:
//
//cpp
#include <iostream>
#include <vector>
#include<set>
using namespace std;
// 请在这里实现 findAllPaths 函数
#include <iostream>
#include <vector>
#include <set>
using namespace std;
//注意vv集合,添加已访问的点,回溯时再删除
void dfs(vector<vector<int>>& graph, int start, int end, vector<vector<int>>& m, vector<int>& co, set<int>& vv) {
co.push_back(start);
vv.insert(start);
if (start == end) {
m.push_back(co);
}
for (int neighbor : graph[start]) {
if (vv.find(neighbor) == vv.end()) {
dfs(graph, neighbor, end, m, co, vv);
}
}
co.pop_back();
vv.erase(start);
}
vector<vector<int>> findAllPaths(vector<vector<int>>& graph, int start, int end) {
vector<vector<int>> m;
vector<int> co;
set<int> vv;
dfs(graph, start, end, m, co, vv);
return m;
}
int main() {
vector<vector<int>> graph = { {1, 2}, {3}, {3}, {} };
int start = 0, end = 3;
vector<vector<int>> paths = findAllPaths(graph, start, end);
for (auto path : paths) {
for (int node : path) {
cout << node << " ";
}
cout << endl;
}
return 0;
}
//输入样例:
//
//图的邻接表表示如下:
//0 -> 1, 2
//1 -> 3
//2 -> 3
//3 ->
//起始节点:0
//终止节点:3
//输出样例:
//
//0 1 3
//0 2 3