// 计算从起点 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(); } }