建设信用卡登录中心网站,怎样做网站跳转,一般网站开发语言,陕西网站建设通报[算法日志]图论#xff1a; 深度优先搜索(DFS)
深度优先概论
深度优先搜索算法是一种遍历图这种数据结构的算法策略#xff0c;其中心思想是朝图节点的一个方向不断跳转#xff0c;当该节点无下一个节点或所有方向都遍历完时#xff0c;便回溯朝上一个节点的另一个方向…[算法日志]图论 深度优先搜索(DFS)
深度优先概论
深度优先搜索算法是一种遍历图这种数据结构的算法策略其中心思想是朝图节点的一个方向不断跳转当该节点无下一个节点或所有方向都遍历完时便回溯朝上一个节点的另一个方向继续遍历。这种搜索策略与回溯法有异曲同工之妙。
DFS的代码框架
void dfs(参数)
{if(终止条件){储存结果;return;}for(遍历节点的各个分支){处理节点dfs(参数);//调用本函数撤销处理回溯}
}正因为和回溯法有相似之处所以其在代码结构上与回溯大致相同。
深搜三部曲 确认递归函数及其参数 在深搜过程中我们通常会定义两个数组容器一个二维数组储存结果一个一维数组储存节点路径。 而递归函数参数我们往往无法在一开始便确认通常都是在书写递归逻辑时按需添加。 确认终止条件 终止条件的不同有时会导致函数的需要遍历的值不同。同时递归条件如果确定错误会导致死循环栈溢出等错误。所以确定好递归条件是比较关键的一步。 遍历节点的各个路径 首先将本节点下一个要遍历的节点放进路径适当处理后进入递归函数回来时将该节点从路径中取出做回溯操作。
深搜的简单应用
leetcode 797
示例代码 void DFS1(const vectorvectorint mygraph, vectorvectorint result, vectorint path, int next){if (mygraph[next].empty() || path.back() mygraph.size() - 1){if (path.back() mygraph.size() - 1)result.push_back(path);return;}const int size mygraph[next].size();for (int i 0; i size; i){path.push_back(mygraph[next][i]);DFS1(mygraph, result, path, mygraph[next][i]);path.pop_back();}}vectorvectorint allPathsSourceTarget(vectorvectorint mygraph){vectorvectorint result;vectorint path;if (mygraph.empty())return result;path.push_back(0);DFS1(mygraph, result, path, 0);return result;}