深度优先搜索(Depth-First-Search)
从起点出发,走过的点要做标记,发现没有走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”
1.判断从V出发是否能走到终点
int main()
{
将所有点标记为新点
起点 = 1;
终点 = 8;
cout<<Dfs(起点);
}
bool Dfs(V){
if(V为终点)
return true;
if(V为旧点)
return false;
将V标记为旧点
对和V相邻的每个节点U{
if(Dfs(U)==true)
return true;
}
return fasle;
}
2.判断从V出发是否能走到终点,如果能,要记录路径:
int main()
{
将所有点标记为新点;
depth = 0;
if(Dfs(起点))
{
for(int i=0;i<=depth;++i)
cout<<path[i]<<endl;
}
}
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;
}
3.深度优先遍历图上所有节点
Dfs (V) {
if( V是旧点 )
return;
将V标记为旧点 ;
对和 V相邻的每个点 U {
Dfs (U);
}
}
int main() {
将所有点 都标记为新;
while( 在图中能找到新点 k)
Dfs (k);
}
4.图的表示方法--邻接矩阵
用一个二维数组G存放图,G[i][j]表示节点i和节点j之间边的情况(如有无边,边方向,权值大小)
遍历复杂度(O(n^2)) n为节点数目
5.图的表示方法--邻接表
每个节点V对应一个一维数组(vector),里面存放从V连出去的边,边的信息包括另一顶点,还可能包含边权值等
遍历复杂度(O(n+e)) n为节点数目,e为边数目
网友评论