深度优先搜索(DFS)

深度优先搜索(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为边数目

猜你喜欢

转载自blog.csdn.net/wayway0554/article/details/79892457