基于 DFS 状态树,展示利用可行性拦截及最优性淘汰进行决策树物理“剪枝”,缩减指数级状态
深度优先搜索 (DFS) 会沿决策树一路向下,直到叶子。如果状态树极深,盲目暴力遍历会导致时间复杂度爆炸。剪枝 (Pruning) 指在搜索过程中,根据已知信息提前判断并回溯。
best_val。在搜索当前分支时,若当前已花代价已经大于或等于 best_val(即便后面全是免费的,也不可能比 best_val 更好),则立即回溯剪枝!
best_val,从而大幅度触发后续的最优性剪枝。
int best_ans = INF;
void dfs(int u, int cost) {
// 1. 可行性剪枝 (越界判断)
if (cost > LIMIT) {
return;
}
// 2. 最优性剪枝 (劣于当前全局最优解)
if (cost >= best_ans) {
return;
}
if (u == target) {
best_ans = min(best_ans, cost); // 更新全局最优
return;
}
for (int v : adj[u]) {
dfs(v, cost + val[v]);
}
}