使用邻接矩阵进行深度优先搜索

时间:2012-08-03 21:52:57

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

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

到目前为止我所拥有的是

 dfs(G,i){

  mark i as visited;

  for(traverse through the edges of i vertex){

     if(vertex of edge is unseen){

       DFS(G,newVerted)
     }
   }

}

4 个答案:

答案 0 :(得分:6)

    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

答案 1 :(得分:4)

您错过了在功能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是成本邻接矩阵。

答案 2 :(得分:0)

我认为这是最简单的,就像在迷宫中一样,你总是离开。如果你来自n节点,则按周期顺序进入下一个节点。

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

修改
例子

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

Am是

......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

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

答案 3 :(得分:0)

我想你可以通过维护堆栈和访问列表并使用while循环来实现: 访问是bool [],初始化为在所有位置保持false,并且我假设调用G [node,neighbor]以某种方式返回一个布尔值,告知是否存在从节点到邻居的边缘。 (与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)
}

我确定它可以进行优化(并且看到我已经厌倦了,可能会出现一些逻辑错误),但如果基本程序有意义,那么它就是一个开始!
编辑:澄清并添加此提示:递归可能更容易;)