C++深度优先搜索算法如何根据邻接矩阵遍历出所有的路径的,请给出详细的代码
时间: 2024-10-09 20:12:25 浏览: 51
C++使用DFS(深度优先)遍历邻接矩阵(源代码)
C++中的深度优先搜索(DFS)通常用于寻找图中的路径,但要根据邻接矩阵遍历所有可能的路径,我们需要修改常规的DFS以记录路径信息,而不是仅判断是否可达。下面是一个示例,展示如何实现这个功能:
```cpp
#include <iostream>
using namespace std;
// 假设邻接矩阵存储在一个二维数组G中,G[i][j]表示节点i与节点j之间是否有边
const int max_size = 100;
bool visited[max_size];
vector<int> path; // 存储当前路径
void DFS(const vector<vector<int>>& G, int start, vector<int>& result) {
visited[start] = true;
path.push_back(start);
// 检查每个未访问的相邻节点
for (int i = 0; i < G[start].size(); ++i) {
if (!visited[G[start][i]]) {
DFS(G, G[start][i], result);
}
}
// 当回溯时,添加路径到结果集合
result.push_back(path);
path.pop_back();
visited[start] = false; // 标记当前节点已完成访问
}
vector<vector<int>> findAllPaths(const vector<vector<int>>& G, int source) {
vector<vector<int>> paths;
DFS(G, source, paths);
return paths;
}
int main() {
// 初始化邻接矩阵并设置源节点
vector<vector<int>> G(max_size, vector<int>(max_size, 0));
// ...填充G...
int source = 0;
vector<vector<int>> all_paths = findAllPaths(G, source);
for (const auto& path : all_paths) {
for (int node : path) {
cout << node << " -> ";
}
cout << endl;
}
return 0;
}
```
这段代码定义了一个名为`findAllPaths`的函数,它接受一个邻接矩阵和一个起始节点作为输入,返回一个包含所有可能路径的二维向量。在`DFS`函数内部,我们不仅标记节点为已访问,还维护了一个路径栈来跟踪路径。当完成搜索后,我们会将找到的路径添加到结果集合中。
请注意,这个版本的DFS会返回所有从起点开始的路径,包括重复的路径。如果你只想得到不重复的路径,可以在主函数中添加去重逻辑或者使用其他方法如拓扑排序。
阅读全文