深搜三部曲(回溯法)
cpp
vector<int> result;
vector<int> path;
void dfs(图, 当前节点){
if(终点){
result.push_back(path);
return;
}
for(遍历相邻节点) {
path.push_back(节点);
dfs(图, 节点);
path.pop()//回溯
}
}
98. 可达路径
cpp
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> result;
vector<int> path;
void dfs(vector<vector<int>> graph, int cur, int N) {
if(cur == N) {
result.push_back(path);
return;
}
for(int i = 1; i <= N; i++){
if(graph[cur][i] == 0){
continue;
}
path.push_back(i);
dfs(graph, i, N);
path.pop_back();
}
}
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> graph (N + 1, vector<int>(N + 1, 0));
while(M--){
int x, y;
cin >> x >> y;
graph[x][y] = 1;
}
path.push_back(1);
dfs(graph, 1, N);
if (result.size() == 0) cout << -1 << endl;
for (const vector<int> &pa : result) {
for (int i = 0; i < pa.size() - 1; i++) {
cout << pa[i] << " ";
}
cout << pa[pa.size() - 1] << endl;
}
}