1、定义:
- 从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不 了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。
- 其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一 步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。
2.优化:
1 可行性剪枝:往后看,看是否满足约束条件
2.最优性剪枝:往前看,看当前点与曾经走过的点的最优值相比,大还是小
3、伪码
判断从V出发是否能走到终点:
bool Dfs(V) {
if( V 为终点)
return true;
if( V 为旧点)
return false;
将V标记为旧点;
对和V相邻的每个节点U {
if( Dfs(U) == true)
return true;
}
return false;
}
int main() {
将所有点都标记为新点;
起点 = 1
终点 = 8
cout << Dfs(起点);
}
判断从V出发是否能走到终点,如果能,要记录路径:
Node path[MAX_LEN]; //MAX_LEN取节点总数即可
int depth;
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)
return true;
}
--depth;//!!!从该点出发已经查找了所有路,不同,则恢复原样
return false;
}
int main() {
将所有点都标记为新点;
depth = 0;
if( Dfs(起点))
{
for(int i = 0;i <= depth; ++ i) cout << path[i] << endl;
}
}
深度优先遍历图上所有节点
Dfs(V) {
if( V是旧点)
return;
将V标记为旧点;
对和V相邻的每个点 U {
Dfs(U);
}
}
int main() {
将所有点都标记为新点;
while(在图中能找到新点k)
Dfs(k);
}
4、图的表示方法:
邻接表:每个节点V对应一个一维数组(vector),里面存放从V连出去 的边,边的信息包括另一顶点,还可能包含边权值等。
vector<vector> NNode(10);//邻接表。NNode[i]是从点i有路 连到的城市集合
遍历复杂度:O(n+e) n为节点数目,e为边数目
邻接矩阵:用一个二维数组G存放图,G[i][ j]表示节点i和节点j之 间边的情况(如有无边,边方向,权值大小等) 。
遍历复杂度:O(n2) n为节点数目