邻接矩阵的深度优先遍历
时间: 2023-07-24 10:31:55 浏览: 45
邻接矩阵的深度优先遍历可以通过使用栈来实现。具体步骤如下:
1. 首先将起始节点压入栈中,并将其标记为已访问。
2. 当栈不为空时,弹出栈顶元素,并遍历其所有未访问的邻居节点。
3. 对于每个未访问的邻居节点,将其压入栈中,并将其标记为已访问。
4. 重复步骤2、3,直到栈为空。
下面是邻接矩阵的深度优先遍历的代码实现:
```python
def dfs(adj_matrix, start):
stack = [start] # 用列表模拟栈
visited = [] # 用列表记录已访问的节点
while stack:
node = stack.pop() # 弹出栈顶元素
visited.append(node) # 将节点标记为已访问
for i in range(len(adj_matrix[node])):
if adj_matrix[node][i] == 1 and i not in visited: # 遍历邻居节点
stack.append(i) # 将邻居节点压入栈中
return visited
```
其中,`adj_matrix` 是邻接矩阵,`start` 是起始节点的索引。函数返回遍历的节点列表。
相关问题
邻接矩阵深度优先遍历
邻接矩阵深度优先遍历的基本思想是从某个顶点开始,沿着一条未被访问过的边走到未访问过的顶点,直到该顶点没有未访问过的邻接点为止,然后回溯到前一个顶点,继续寻找其未访问过的邻接点,直到所有顶点都被访问过为止。
具体实现时,我们可以使用一个栈来存储当前正在访问的顶点,每次从栈顶取出一个顶点进行处理,将其未访问过的邻接点入栈,直到栈为空为止。
以下是邻接矩阵深度优先遍历的伪代码:
```
DFS(v)
visited[v] = true // 标记当前顶点已被访问
for i = 1 to n do
if graph[v][i] = 1 and visited[i] = false then // 如果当前顶点与顶点i之间有边且i未被访问
DFS(i) // 递归访问顶点i
```
其中,`graph`为邻接矩阵,`visited`为记录顶点是否被访问过的数组,`n`为顶点个数,`v`为当前正在访问的顶点。
用c语言实现邻接矩阵深度优先遍历
邻接矩阵深度优先遍历是一种图遍历算法,它可以遍历一个图中所有的节点,并且保证不会重复遍历同一个节点。下面是一个用C语言实现邻接矩阵深度优先遍历的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
int visited[MAX_VERTICES];
int adjacency_matrix[MAX_VERTICES][MAX_VERTICES];
int vertices_count;
void dfs(int vertex) {
int i;
printf("%d ", vertex);
visited[vertex] = 1;
for (i = 0; i < vertices_count; i++) {
if (adjacency_matrix[vertex][i] && !visited[i]) {
dfs(i);
}
}
}
int main() {
int i, j;
scanf("%d", &vertices_count);
for (i = 0; i < vertices_count; i++) {
visited[i] = 0;
for (j = 0; j < vertices_count; j++) {
adjacency_matrix[i][j] = 0;
}
}
for (i = 0; i < vertices_count; i++) {
for (j = 0; j < vertices_count; j++) {
scanf("%d", &adjacency_matrix[i][j]);
}
}
dfs(0);
return 0;
}
```
在这个程序中,我们首先定义了一个 `visited` 数组,用于记录每个节点是否被访问过。然后定义了一个邻接矩阵 `adjacency_matrix`,用于存储图的边信息。接着我们定义了一个 `dfs` 函数,用于进行深度优先遍历。最后在 `main` 函数中,我们读入了图的节点数量和邻接矩阵,然后调用 `dfs` 函数进行遍历。
在 `dfs` 函数中,我们首先输出当前节点的编号,并将其标记为已访问。然后遍历与该节点相邻的所有节点,如果该节点未被访问过,则递归调用 `dfs` 函数进行遍历。这样就可以完成邻接矩阵深度优先遍历了。