Java教程

数据结构+算法(搜索类:BFS + DFS )

本文主要是介绍数据结构+算法(搜索类:BFS + DFS ),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

BFS

典型搜索树示意图

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    std::queue<Node> q; // 核心数据结构
    std::set<Node> visited; // 避免走回头路
    
    q.push(start); // 将起点加入队列
    visited.insert(start);
    int step = 0; // 记录扩散的步数

    while (!q.empty()) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            auto cur = q.front();
          	q.pop();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的相邻节点加入队列 */
            for (Node x : cur.adj()) {
                if (visited.count(x) < 0) {
                    q.push(x);
                    visited.insert(x);
                }
            }
        }
        /* 划重点:更新步数在这里 */
        step++;
    }
}

 

DFS

决策树

 

/*
*@param: origin_source 一般是给定的输入
*@param: track_res 期望的最终结果
*@param: single_track 期望目标结果中的单个case
*@param: cur_index 当前执行的阶段
*/
void backtrack(DataType origin_source, vector<DataType> track_res, DataType& single_track,int cur_index) {
    // 触发结束条件。这里用cur_index 或者single_track 的内容做判断均可
    if (cur_index == 边界条件) { 
        track_res.push_back(single_track);
        return;
    }
    
    for (int i = 0; i < origin_source.size(); i++) {
        // 排除不合法的选择
        if (isValid())
            continue;
        // 做选择,将当前选择加入
        single_track.push(origin_source[i]);
        // 进入下一层决策树
        backtrack(origin_source, track_res, singhle_track, cur_index++);
        // 取消选择
        single_track.pop();
    }
}
这篇关于数据结构+算法(搜索类:BFS + DFS )的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!