【问题标题】:Depth First Search Using Adjacency Matrix使用邻接矩阵的深度优先搜索
【发布时间】:2012-08-03 21:52:56
【问题描述】:

谁能解释使用邻接矩阵进行深度优先搜索的算法? 我知道使用递归的深度优先搜索算法,我尝试使用邻接矩阵来实现它,但它不是很成功。

到目前为止我所拥有的是

 dfs(G,i){

  mark i as visited;

  for(traverse through the edges of i vertex){

     if(vertex of edge is unseen){

       DFS(G,newVerted)
     }
   }

}

【问题讨论】:

  • 怎么了?您的伪代码在理论上看起来不错(除了 BFS 部分:)。如果您可以使用邻接列表进行 DFS,那么使用矩阵进行处理应该只是遍历该矩阵的行并查看设置位的位置以及尚未访问的顶点
  • 你了解什么是深度优先搜索吗?你了解什么是邻接矩阵吗?

标签: algorithm data-structures depth-first-search


【解决方案1】:
    void DFS(int i)
    {
        int j;
        printf("\n%d",i);
        visited[i]=1;
        for(j=0;j<n;j++)
            if(!visited[j]&&G[i][j]==1)
                DFS(j);
    }

其中n是顶点数,G是图形,G[i][j]表示顶点i连接到顶点j

【讨论】:

    【解决方案2】:

    你错过了在函数dfs(G,i)中打印

    代码如下

    dfs(G,i){
    int j;
    printf("%d ",i);
    visited[i]=1;
    for(j=0;j<n;j++){
        if(visited[j]==0&&G[i][j]==1)
            dfs(G,j);
    }
    

    这里我们使用变量n作为Graph中的顶点数。G是成本邻接矩阵。

    【讨论】:

      【解决方案3】:

      我认为最简单的方法是,就像在迷宫中一样,你总是向左走。如果您来自 n 个节点,则按递增顺序循环进入下一个节点。

      我只是不知道你怎么知道你来了 :D 但很酷的是你不需要额外的空间和标记。

      编辑
      例子

          5
         / \
        7   3
       /\   /\
      4  1 6  2
      

      然后是

      ......1
      ..1....
      .1..11.
      1.....1
      ..1...1
      ..1....
      1..11..
      

      所以从 5 开始排序是 3 6 3 2 3 5 7 1 7 4 7 5 3# 因为你从 5->3

      正如我所说,如果您在节点上,则根据您来自的节点继续下一个节点。您要访问的下一个节点是前一个节点的下一个编号(不是您要访问的当前节点)。

      【讨论】:

        【解决方案4】:

        我想你可以通过维护一个堆栈和一个访问列表,并使用一个 while 循环来做到这一点: Visited 是一个 bool[],初始化为在所有位置都保持 false,我假设调用 G[node,neighbour] 以某种方式返回一个布尔值,告诉是否存在从节点到邻居的边。 (隐式比较 1 或简单地使邻接矩阵保持布尔值)
        Stack 保存节点的索引:

        dfs(G,i){
            Initialize Stack
            Current = i
            PossibleEdge = 0
            Visited[Current] = true  //You have visited the starting node
            Do {
                While (PossibleEdge < count) {
                    if (G[Current,PossibleEdge] && NOT Visited[PossibleEdge]){
                        Stack.Push(Current)      //Save state
                        Current = PossibleEdge   //Continue with the child node
                        Visited[Current] = true 
                        PossibleEdge = -1        //So that it will be incremented to 0
                    }
                    PossibleEdge++
                }
                PossibleEdge = Current           //Continue to next row of "parent node"
                Current = Stack.Pop()            //Get parent node back
            } While (Stack contains nodes)
        }
        

        我确信它可以被优化(看到我累死了,可能存在一些逻辑错误),但如果基本过程有意义,那就是一个开始!
        编辑: 澄清并添加此提示:递归可能更容易;)

        【讨论】:

          猜你喜欢
          • 2017-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多