第一章 搜索算法 第一节 深度优先搜索

可能刚接触OI的人一般第一个就会学习“递归”(或者称之为回溯)算法,也即下面这种形式:
 
Procedure Search(变量);
begin
 {执行语句}
 Search(深度+1)
 {返回原状态}
end.
 
实际上,这就是深度优先搜索的一种通常使用的表现方式(下文将给出一个更为规范的深度优先搜索伪代码)。
那么,深度优先算法是什么呢?现在,我们以一个例题来说明。
例1.            健康的Holstein奶牛
Farmer John以拥有世界上最健康的奶牛为骄傲。他知道每种饲料中所包含的的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。
这一题,我们发现我们可以枚举饲料对牛的使用情况(喂或不喂)来解答出答案。把所有我们枚举的情况列出来后,便构成了一棵深度为饲料数的树。深度优先搜索就是把这棵树想尽方法先往深处走,如果走不到答案则回到当前结点的父结点后继续走该结点的其他儿子。这就是深度优先搜索中的“深度优先”的来历。
深度优先搜索是一个非常有用的算法,在各种题目中都起着非常重要的作用,是务必要熟练掌握的算法之一。
 
[附录]一个更为规范的深度优先搜索伪代码
Procedure DepthFirstSearch(State:StateType; Depth:integer);
begin
for Operand:=1 to OperandCount(State) do
begin
 NewState:=DoOperand(State,Operand);
 If answer then
    PrintAnswer
 Else if depth<maxdepth then
    Search(NewState,depth)
end;
    end;
posted @ 2008-12-22 11:15  jesonpeng  阅读(260)  评论(0编辑  收藏  举报