Offer68题 Day3 图的两个基础算法

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;
}
posted @   itsinsane  阅读(5)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示