赞
踩
深度优先搜索是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
选择一个起始节点:在图中选择一个起始节点。
标记节点:将起始节点标记为已访问,并放入一个访问列表(或栈)中。
遍历邻居节点:对于当前节点的每一个未访问的邻居节点,执行以下操作:
回溯:如果当前节点的所有邻居节点都已被访问过,那么从访问列表(或栈)中弹出当前节点,并将前一个节点设置为当前节点(回溯到上一个节点)。
继续搜索:重复步骤3和4,直到访问列表(或栈)为空,即所有可达节点都已被访问。
DFS算法在许多领域都有应用,包括但不限于:
以下是一个使用递归实现的DFS算法的基本框架(以图为例):
cpp复制代码
#include <iostream> | |
#include <vector> | |
using namespace std; | |
// 图的邻接表表示 | |
vector<int> adj[100]; | |
bool visited[100]; // 标记节点是否已被访问 | |
// DFS遍历函数 | |
void dfs(int v) { | |
visited[v] = true; // 标记当前节点为已访问 | |
cout << v << " "; // 访问当前节点 | |
// 遍历当前节点的所有邻居 | |
for (int i = 0; i < adj[v].size(); i++) { | |
int neighbor = adj[v][i]; | |
if (!visited[neighbor]) { // 如果邻居节点未被访问 | |
dfs(neighbor); // 递归访问邻居节点 | |
} | |
} | |
} | |
int main() { | |
// 图的初始化(添加边等)... | |
// 假设从节点0开始遍历 | |
dfs(0); | |
return 0; | |
} |
注意:这个示例仅用于说明DFS的基本思路,并不包含图的完整初始化和边的添加代码。在实际应用中,你需要根据你的具体需求来初始化图和添加边。
DFS算法(深度优先搜索)具有广泛的应用场景,以下是一些主要的例子:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。