深度优先搜索(Depth-First-Search)
从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不 了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。
其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一 步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。
中国大学mooc 郭炜老师的算法上讲的几个模板(伪代码)
我写了一下注释,便于理解
1.判断从V出发是否能走到终点
int main()
{将所有点标记为新点起点 = 1;终点 = 8;cout<<Dfs(起点);
}bool Dfs(V){if(V为终点)return true;if(V为旧点)return false;将V标记为旧点对和V相邻的每个节点U{//往往要写多个if,将每个相邻节点都考虑到if(Dfs(U)==true)return true;
}return fasle;
}
2.判断从V出发是否能走到终点,如果能,要记录路径:
Node path[MAX_LEN];//MAX_LEN取节点总数即可
//path,记录路径。node,可以是int(节点标号),也可以是结构题类型
int depth;//深度int main()
{将所有点标记为新点;//一般memset全变成0表示新点,1表示旧点depth = 0;if(Dfs(起点)){for(int i=0;i<=depth;++i)//输出经过的每个点的路径cout<<path[i]<<endl;}
}bool Dfs(V){if(V为终点)path[depth]=V;return true;
}if(V为旧点)return false;将V标记为旧点;path[depth]=V;++depth;对和V相邻的每个节点U{if(Dfs(U)==true)
//如果返回true,那么说明,从v开始能走到终点
}--depth;//现在v是放到path里的,但是返回false,说明从v出发走不到终点,//v不应出现在路径里,所以深度减一。return false;
}
3.深度优先遍历图上所有节点
Dfs (V) { if( V是旧点 )return; //如果v已经走过,那马上返回将V标记为旧点 ;对和 V相邻的每个点 U { Dfs (U);//包含他的父节点和子节点都要涉及到//常用if判断条件是否满足,然后dfs}
}
int main() {将所有点 都标记为新;while( 在图中能找到新点 k)Dfs (k);//这样避免了有多个连通图的情况
}