第七章作业1--基本概念-计科19-3-4 6-1 邻接矩阵存储图的深度优先遍历 (20分)

本文介绍如何使用邻接矩阵存储方式实现图的深度优先遍历算法,并提供了一个具体的C语言实现示例。该算法从指定顶点开始,递归访问所有可达顶点。

6-1 邻接矩阵存储图的深度优先遍历 (20分)

试实现邻接矩阵存储图的深度优先遍历。

函数接口定义:

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );

其中MGraph是邻接矩阵存储的图,定义如下:

typedef struct GNode *PtrToGNode;
struct GNode{
   
   
    int Nv;  /* 顶点数 */
    int Ne;  /* 边数   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */

函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V是图中的合法顶点。

裁判测试程序样例:

#include 
7-1 实验6-1-邻接矩阵数 50 作者 华蓓 单位 广西大学 利用邻接矩阵存储无向,并从0号顶点开始进行深度优先遍历。 输入格式: 输入第一行是两个整数n1 n2,其中n1表示顶点数(则顶点编号为0至n1-1),n2表示中的边数。 之后有n2行输入,每行输入表示一条边,格式是“顶点1 顶点2”,把边插入中。 例如: 4 4 0 1 1 3 0 3 0 2 输出格式: 先输出存储邻接矩阵,同一行元素之间空1格,最后一个元素之后不要有空格。 之后空一行后输出从0号顶点开始的深度优先遍历序列,顶点编号之间空1格。 例如,对于上面的示例输入,输出为: 0 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 1 3 2 说明:输入第14表示有4个顶点,第2个4表示有4条边。之后的4行输入代表4条边的顶点。输出的前4行为邻接矩阵,之后空一行,然后输出的“0 1 3 2”是深度优先遍历序列。 输入样例: 在这里给出一组输入。例如: 5 4 0 2 1 2 0 3 0 4 输出样例: 在这里给出相应的输出。例如: 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 2 1 3 4 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB C (gcc) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include <stdio.h> #include <string.h> #define MAX_N 100 int n, m; int graph[MAX_N][MAX_N]; int visited[MAX_N]; int dfs_order[MAX_N]; // 用于存储 DFS 遍历顺序 int order_idx = 0; // 遍历顺序的索引 // 深度优先搜索 void dfs(int v) { visited[v] = 1; dfs_order[order_idx++] = v; // 将访问的节点存入数组 for (int i = 0; i < n; i++) { if (graph[v][i] == 1 && !visited[i]) { dfs(i); } } } int main() { // 输入顶点数和边数 scanf("%d %d", &n, &m); // 初始化邻接矩阵 memset(graph, 0, sizeof(graph)); // 建立无向 for (int i = 0; i < m; i++) { int u, v; scanf("%d %d", &u, &v); graph[u][v] = 1; graph[v][u] = 1; 概
最新发布
12-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值