1. DFS深度优先算法
/*
- 深度优先算法
DFS 从起始节点出发,沿着一条路径尽可能深入地访问每个节点,直到无法继续时再回退,寻找未访问的节点。
- 使用递归实现。
*/
#include <iostream>
#include <vector>
using namespace std;
void DFS(int node, vector<vector<int>>& graph, vector<bool>& visited) {
visited[node] = true; // 标记当前节点为已访问
cout << node << " "; // 输出当前节点
for (int neighbor : graph[node]) { // 遍历当前节点的所有邻居节点
if (!visited[neighbor]) { // 如果邻居节点未被访问
DFS(neighbor, graph, visited);// 递归调用DFS访问该邻居节点
}
}
}
int main() {
vector<vector<int>> graph = {
{1, 2}, {0, 3, 4}, {0}, {1}, {1} // 邻接表表示的图
};
vector<bool> visited(graph.size(), false); // 初始化访问标记数组,全部为 false
cout << "DFS: ";
DFS(0, graph, visited); // 从节点 0 开始 DFS
return 0;
}
2. BFS广度优先算法
/*
- 广度优先算法
BFS 从起始节点出发,逐层访问相邻节点。先访问起始节点,再访问其所有邻居节点,然后逐层扩展。
- 使用队列实现。
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void BFS(int start, vector<vector<int>>& graph,vector<bool> &visited) {
queue<int> q;
visited[start] = true; // 标记起始节点为已访问
q.push(start); // 将起始节点加入队列
while (!q.empty()) { // 当队列非空时
int node = q.front(); // 获取队列首节点
q.pop(); // 移除队列首节点
cout << node << " "; // 输出当前节点
for (int neighbor : graph[node]) { // 遍历当前节点的所有邻居节点
if (!visited[neighbor]) { // 如果邻居节点未被访问
visited[neighbor] = true; // 标记邻居节点为已访问
q.push(neighbor); // 将邻居节点加入队列
}
}
}
}
int main() {
vector<vector<int>> graph = {
{1, 2}, {0, 3, 4}, {0}, {1}, {1} // 邻接表表示的图
};
vector<bool> visited(graph.size(), false); // 初始化访问标记数组
cout << "BFS: ";
BFS(0, graph,visited); // 从节点 0 开始 BFS
return 0;
}
标签:graph,Day3,Offer68,访问,算法,vector,visited,include,节点
From: https://www.cnblogs.com/itsinsane/p/18514503