写一个C++版本的深度优先搜索算法,搜索的是有向邻接表,把所有的路径输出
时间: 2024-10-09 16:04:42 浏览: 34
当然,我可以为你提供一个简单的C++版本的深度优先搜索(DFS)算法,用于遍历有向邻接表并输出所有路径。这个例子假设我们有一个`AdjacencyList`类表示图的邻接列表结构,其中包含节点和指向其邻居的边。
```cpp
#include <iostream>
#include <vector>
#include <stack>
// 节点类,这里假设每个节点有一个唯一的标识id
class Node {
public:
int id;
// 添加邻居的指针列表
std::vector<Node*> neighbors;
Node(int id) : id(id) {}
};
// 邻接列表类,存储了图的结构
class AdjacencyList {
private:
std::vector<Node*> nodes; // 存储所有节点
public:
void addNode(Node* node) { nodes.push_back(node); }
// DFS 函数,输入起始节点和结果栈
void dfs(Node* start, std::stack<std::string>& resultStack) {
if (!start->neighbors.empty()) {
bool visited[start->neighbors.size()] = {false}; // 记录已访问的节点
for (Node* neighbor : start->neighbors) {
dfs(neighbor, resultStack);
visited[neighbor - nodes.begin()] = true;
resultStack.push_to_string(start->id + " -> "); // 将路径追加到结果栈
resultStack.push(neighbor->id); // 推入当前节点
}
// 如果当前节点未到达终点,需要回溯
while (!resultStack.empty() && !visited[resultStack.top()]) {
resultStack.pop(); // 回溯一步
}
} else {
resultStack.push(start->id); // 达到终止条件,直接推入节点ID
}
}
void findAllPaths(Node* target) {
std::stack<std::string> resultStack; // 初始化结果栈
dfs(target, resultStack);
// 输出所有路径
if (!resultStack.empty()) {
for (const auto& path : resultStack) {
std::cout << path << std::endl;
}
}
}
};
int main() {
// 初始化图和节点...
AdjacencyList adjList;
// ...
Node* target = ...; // 定义目标节点
adjList.findAllPaths(target); // 执行深度优先搜索
return 0;
}
```
在这个例子中,`findAllPaths`函数会查找从给定目标节点的所有可达路径,并将它们打印出来。请注意,你需要根据实际的邻接列表结构和需求调整`Node`和`AdjacencyList`类。
阅读全文