深度优先搜索(Depth-First-Search)

从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。

其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。

//在图上寻找路径

//判断从V出发是否能走到终点
bool Dfs(V){
    if(V为终点)
        return true;
    if(V为旧点)
        return false;
    将V标记为旧点;
    对和V相邻的每个节点U{
        if(Dfs(U)==true)
            return true;
    }
    return false;
}
//判断从V出发是否能走到终点,如果能,要记录路径

Node path[MAX_LEN]; //MAX_LEN取节点总数即可
//Node是图中节点的类型,path数组记录走过的节点路径
int depth;
//从起点走到一个节点,走了多少步,那它的深度就是多少,如起点的深度为0

bool Dfs(V){
    if(V为终点){
        path[depth]=V;   //V点的深度为depth,depth用来记录当前点的深度
        return true;
    }
    if(V为旧点)
        return false; //因为V已经走过了
    将V标记为旧点;
    path[depth]=V;
    ++depth; //因为V的下一个点的depth要加一
    对和V相邻的每个节点U{
        if(Dfs(U)==true) //判断与V相邻的节点能不能到达终点
            return true;
    }
    --depth; 
    //若与V相邻的每个节点都无法到达终点,说明从V出发到不了终点
    //说明V不应该出现在从起点到终点的路径上面,所以--depth,就把放在path数组中的V剔除了
    return false; //相当于回退到了V的父节点,深度也要减掉一层
}

//主函数
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);
}

猜你喜欢

转载自blog.csdn.net/ru_ruo1/article/details/84559969