谁能解释使用邻接矩阵进行深度优先搜索的算法?我知道使用递归的深度优先搜索算法,我尝试使用邻接矩阵来实现它,但它不是很成功。
到目前为止我所拥有的是
dfs(G,i){
mark i as visited;
for(traverse through the edges of i vertex){
if(vertex of edge is unseen){
DFS(G,newVerted)
}
}
}
谁能解释使用邻接矩阵进行深度优先搜索的算法?我知道使用递归的深度优先搜索算法,我尝试使用邻接矩阵来实现它,但它不是很成功。
到目前为止我所拥有的是
dfs(G,i){
mark i as visited;
for(traverse through the edges of i vertex){
if(vertex of edge is unseen){
DFS(G,newVerted)
}
}
}
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
您错过了打印功能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 是成本邻接矩阵。
我认为最简单的方法是,就像在迷宫中你总是向左走。如果您来自 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
正如我所说,如果你在节点上,你会根据你来自的节点继续下一个节点。您要访问的下一个节点是前一个节点(不是您从当前节点)的下一个数字。
我想你可以通过维护一个堆栈和一个访问列表并使用一个while循环来做到这一点:Visited is a bool[],初始化为在所有位置都保持假,我假设调用 G[node,neighbour]以某种方式返回一个布尔值,说明从节点到邻居是否存在边。(隐式比较 1 或简单地使邻接矩阵保持布尔值)
堆栈保存节点的索引:
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)
}
我确信它可以优化(并且看到我累死了,可能存在一些逻辑错误),但如果基本过程有意义,那就是一个开始!
编辑:澄清,并添加这个提示:递归可能更容易;)