有人能解释使用邻接矩阵进行深度优先搜索的算法吗? 我知道使用递归的深度优先搜索的算法,我尝试使用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)
}
}
}
答案 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)
}
我确定它可以进行优化(并且看到我已经厌倦了,可能会出现一些逻辑错误),但如果基本程序有意义,那么它就是一个开始!
编辑:澄清并添加此提示:递归可能更容易;)