题目来源:https://kamacoder.com/problempage.php?pid=1170
C++题解1:深度优先搜索,邻接矩阵
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> result;
vector<int> path;
void dfs(const vector<vector<int>>& graph, int x, int N){
path.push_back(x);
if(x == N) result.push_back(path);
else {
for(int i = 1; i <= N; i++) {
if(graph[x][i] == 1) dfs(graph, i, N);
}
}
path.pop_back();
return;
}
int main() {
// 输入
int N, M;
cin >> N >> M;
vector<vector<int>> graph(N+1, vector<int>(N+1, 0));
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
// 使用邻接矩阵 表示无线图,1 表示 s 与 t 是相连的
graph[a][b] = 1;
}
// 处理 从起点1开始
dfs(graph, 1, N);
// 输出
int length = result.size();
if(length == 0) {
cout<<-1;
return 0;
}
for(int k = 0; k < length; k++) {
for(int m = 0; m < result[k].size(); m++){
cout<<result[k][m];
if(m == result[k].size()-1) cout<<endl;
else cout<<" ";
}
}
return 0;
}
C++题解2:深度优先搜索,邻接表
#include <iostream>
#include <vector>
#include <list>
using namespace std;
vector<vector<int>> result;
vector<int> path;
void dfs(const vector<list<int>>& graph, int x, int N){
path.push_back(x);
if(x == N) result.push_back(path);
else {
int mm = graph[x].size();
// 注意list的迭代方式
for(auto i:graph[x]) dfs(graph, i, N);
}
path.pop_back();
return;
}
int main() {
// 输入
int N, M;
cin >> N >> M;
vector<list<int>> graph(N+1);
for (int i = 0; i < M; i++) {
int a, b;
// 使用邻接表 ,表示 a -> b 是相连的
cin >> a >> b;
graph[a].push_back(b);
}
// 处理
dfs(graph, 1, N);
// 输出
int length = result.size();
if(length == 0) {
cout<<-1;
return 0;
}
for(int k = 0; k < length; k++) {
for(int m = 0; m < result[k].size(); m++){
cout<<result[k][m];
if(m == result[k].size()-1) cout<<endl;
else cout<<" ";
}
}
return 0;
}