试实现邻接矩阵存储图的深度优先遍历。
时间: 2023-04-22 09:02:40 浏览: 153
深度优先遍历邻接矩阵存储图的实现方法:
1. 从图中任选一个顶点作为起始点,将其访问标记设为已访问。
2. 查找以该顶点为起始点的所有未访问的邻接点,并依次递归地对这些邻接点进行深度优先遍历。
3. 当所有邻接点都已被访问过,回溯到该顶点的上一个顶点,重复步骤2。
4. 遍历完整张图后结束算法。
相关问题
c语言实现邻接矩阵非递归深度优先遍历
邻接矩阵是表示图的一种方式,非递归深度优先遍历是指不使用递归算法来实现深度优先遍历。下面是C语言实现邻接矩阵非递归深度优先遍历的步骤:
1. 定义一个栈结构,用于存储待遍历的节点。
2. 定义一个visited数组,用于记录每个节点是否已经被遍历。
3. 从某个起始节点开始,将其压入栈中,并将visited数组中对应位置标记为已访问。
4. 循环执行以下步骤直到栈为空:
a. 取出栈顶元素,并输出该节点。
b. 遍历该节点的所有邻居节点,若该邻居节点未被访问,则将其压入栈中并标记为已访问。
下面是邻接矩阵非递归深度优先遍历的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef int VertexType;
typedef int EdgeType;
typedef struct {
VertexType vertex[MAX_VERTEX_NUM];
EdgeType edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertex_num, edge_num;
} MGraph;
typedef struct {
VertexType data[MAX_VERTEX_NUM];
int top;
} Stack;
void InitStack(Stack *S) {
S->top = -1;
}
void Push(Stack *S, VertexType x) {
S->data[++S->top] = x;
}
VertexType Pop(Stack *S) {
return S->data[S->top--];
}
int IsEmpty(Stack *S) {
return S->top == -1;
}
void CreateGraph(MGraph *G) {
int i, j;
printf("请输入图的顶点数和边数:\n");
scanf("%d %d", &G->vertex_num, &G->edge_num);
printf("请输入各个顶点:\n");
for (i = 0; i < G->vertex_num; i++) {
scanf("%d", &G->vertex[i]);
}
for (i = 0; i < G->vertex_num; i++) {
for (j = 0; j < G->vertex_num; j++) {
G->edge[i][j] = 0;
}
}
printf("请输入各条边的起点和终点:\n");
for (i = 0; i < G->edge_num; i++) {
int u, v;
scanf("%d %d", &u, &v);
G->edge[u][v] = G->edge[v][u] = 1;
}
}
void DFS(MGraph *G, int v, int visited[]) {
Stack S;
InitStack(&S);
Push(&S, v);
visited[v] = 1;
while (!IsEmpty(&S)) {
int i, w = Pop(&S);
printf("%d ", G->vertex[w]);
for (i = 0; i < G->vertex_num; i++) {
if (G->edge[w][i] && !visited[i]) {
Push(&S, i);
visited[i] = 1;
}
}
}
}
void DFSTraverse(MGraph *G) {
int visited[MAX_VERTEX_NUM] = {0};
int i;
for (i = 0; i < G->vertex_num; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
}
int main() {
MGraph G;
CreateGraph(&G);
DFSTraverse(&G);
return 0;
}
```
id:252】【50分】A. 邻接矩阵存储图的深度优先遍历 时间限制 1s 内存限制 128MB 题目描述 试实现邻接矩阵存储图的深度优先遍历。 输入 第一行n为顶点数,第二行至第n+2行为其邻接矩阵表示形式,最后一行为遍历的起始点。 输出 见样例
以下是 Python 代码实现邻接矩阵存储图的深度优先遍历:
```python
def dfs(graph, start, visited):
visited.add(start)
print(start, end=' ')
for neighbor in range(len(graph)):
if graph[start][neighbor] == 1 and neighbor not in visited:
dfs(graph, neighbor, visited)
# 读入邻接矩阵存储的图
n = int(input())
graph = []
for i in range(n):
row = list(map(int, input().split()))
graph.append(row)
# 读入起始点
start = int(input())
# 开始深度优先遍历
visited = set()
dfs(graph, start, visited)
```
其中,`graph` 是邻接矩阵存储的图,`start` 是遍历的起始点,`visited` 是已经访问过的节点集合。函数 `dfs` 实现了深度优先遍历,先将起始点标记为已访问,输出起始点,然后递归地访问所有与该节点相邻的未访问过的节点。
注意:这里的节点编号从 0 开始。
阅读全文