【数据结构实验】图(三)图的深度优先搜索(DFS)生成树

文章目录

  • 1. 引言
  • 2. 深度优先搜索生成树
  • 3. 实验内容
    • 3.1 实验题目
      • (一)输入要求
      • (二)输出要求
    • 3.2 算法实现
      • 1. 数据结构
      • 2. 队列操作函数
      • 3. 广度优先搜索遍历
      • 4. 创建图
      • 5. 深度优先搜索算法
      • 6. 主函数及DFS主函数
      • 7. 输出生成树信息
    • 3.3 代码整合
  • 4. 实验结果

1. 引言

  深度优先搜索(DFS)是图算法中的一种重要的遍历方法,它通过深度遍历图的顶点来构建生成树。生成树是一个无回路的连通子图,包含了原图的所有顶点,但是边数最少。

本实验将通过C语言实现深度优先搜索生成树。

2. 深度优先搜索生成树

  深度优先搜索是一种递归的图遍历算法,其主要思想是从起始顶点开始,尽可能深入图中的每一个分支,直到不能再深入为止,然后回溯到上一个分支。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 实验内容

3.1 实验题目

   以顶点 0 为起始顶点,求图 G 的深度优先搜索生成树(即深度优先遍历过程形成的树)。

(一)输入要求

{0,1,1,1,1,0,0},
{0,0,1,1,0,0,0},
{1,0,0,0,0,0,0},
{0,0,1,0,0,0,0},
{0,0,0,0,0,1,1},
{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0}

使用前文得到的邻接表做为输入数据

(二)输出要求

输出树中所有结点。结点输出格式如下:(顶点,顶点的父亲,顶点所在的层数)比如,对下面这棵树,有以下输出。
在这里插入图片描述

3.2 算法实现

1. 数据结构

typedef struct P {int VerAdj;struct P *link;
} P;typedef struct Q {int VerName;P *Adjacent;int Visited;
} Q;typedef struct {Q Head[20];
} Graph;typedef struct Tree {Q data;struct Tree *FirstChild;struct Tree *NextBrother;
} Tree;typedef struct q {Tree *data;struct q *next;
} Queue;
  • P结构体: 用于表示图中的邻接点,VerAdj表示邻接顶点,link指向下一个邻接点。

  • Q结构体: 用于表示图中的顶点,VerName表示顶点名称,Adjacent指向邻接点链表,Visited表示是否被访问过。

  • Graph结构体: 表示整个图,包含一个数组Head,每个元素表示一个顶点。

  • Tree结构体: 表示生成树中的节点,包含一个数据域data,表示顶点,以及FirstChildNextBrother分别指向第一个孩子和下一个兄弟节点。

  • Queue结构体: 用于实现队列,存储生成树的节点。

注:自编代码,比较丑陋,请忽略细节

2. 队列操作函数

void QInsert(Tree *item);
void QDelete();
  • QInsert: 将生成树节点插入队列。

  • QDelete: 从队列中删除节点。

3. 广度优先搜索遍历

void LevelOrder(Tree *t);
  • LevelOrder: 广度优先搜索遍历生成树,输出节点信息,包括顶点、父亲和层数。

4. 创建图

void Create(Graph *g);
  • Create: 根据邻接矩阵A创建图,构建邻接表。

5. 深度优先搜索算法

void DepthForceSearch(Graph *g, int i, Tree *t);
  • DepthForceSearch: 递归实现深度优先搜索,构建生成树。

6. 主函数及DFS主函数

int main();
void DFS_Main(Graph *g, Tree *t);
  • main函数: 创建图,调用DFS_Main进行深度优先搜索,输出生成树的节点信息。

  • DFS_Main: 遍历所有未访问的顶点,以每个未访问的顶点为根进行深度优先搜索。

7. 输出生成树信息

void Output(Tree *t);
  • Output: 输出生成树的节点信息。

3.3 代码整合

#include <stdio.h>
#include <stdlib.h>#define N 7
int A[N][N] = {{0, 1, 1, 1, 1, 0, 0},{0, 0, 1, 1, 0, 0, 0},{1, 0, 0, 0, 0, 0, 0},{0, 0, 1, 0, 0, 0, 0},{0, 0, 0, 0, 0, 1, 1},{0, 0, 0, 0, 0, 0, 1},{0, 0, 0, 0, 0, 0, 0}
};typedef struct P {int VerAdj;struct P *link;
} P;typedef struct Q {int VerName;P *Adjacent;int Visited;
} Q;typedef struct {Q Head[20];
} Graph;typedef struct Tree {Q data;struct Tree *FirstChild;struct Tree *NextBrother;
} Tree;typedef struct q {Tree *data;struct q *next;
} Queue;Queue *front = NULL, *rear = NULL, *pos = NULL;void QInsert(Tree *item);
void QDelete();
void LevelOrder(Tree *t);
void Create(Graph *g);
void DepthFirstSearch(Graph *g, int i, Tree *t);
void DFS_Main(Graph *g, Tree *t);
void Output(Tree *t);int main() {Graph g;Tree t;Create(&g);printf("深度遍历:\n");DFS_Main(&g, &t);printf("生成树结点信息:\n");Output(&t);return 0;
}void QInsert(Tree *item) {Queue *s = (Queue *)malloc(sizeof(Queue));s->data = item;s->next = NULL;if (front == NULL)front = s;elserear->next = s;rear = s;
}void QDelete() {if (front == NULL) {printf("队列为空");return;}Queue *p = front;front = p->next;free(p);if (front == NULL)rear = NULL;
}void LevelOrder(Tree *t) {if (t != NULL)QInsert(t);while (front != NULL) {Tree *p = front->data;printf("(%d, %d, %d) ", p->data.VerName, t->data.VerName, p->data.VerName);while (p != NULL) {if (p->FirstChild != NULL) {QInsert(p->FirstChild);}p = p->NextBrother;}QDelete();}
}void Create(Graph *g) {int i, j, n, t;for (i = 0; i < N; i++) {g->Head[i].VerName = i;g->Head[i].Adjacent = NULL;P *p = (P *)malloc(sizeof(P));t = 0;for (j = 0; j < N; j++) {if (A[i][j]) {if (t == 0) {g->Head[i].Adjacent = p;p->VerAdj = j;p->link = NULL;t = 1;} else {P *q = (P *)malloc(sizeof(P));q->VerAdj = j;q->link = NULL;p->link = q;p = q;}}}}
}void Output(Tree *t) {if (t != NULL)LevelOrder(t);
}void DepthForceSearch(Graph *g, int i, Tree *t) {P *p;g->Head[i].Visited = 1;p = g->Head[i].Adjacent;t->data = g->Head[i];while (p != NULL) {if (!g->Head[p->VerAdj].Visited) {Tree *child = (Tree *)malloc(sizeof(Tree));child->NextBrother = NULL;child->FirstChild = NULL;DepthForceSearch(g, p->VerAdj, child);Tree *temp = t->FirstChild;if (temp == NULL) {t->FirstChild = child;} else {while (temp->NextBrother != NULL) {temp = temp->NextBrother;}temp->NextBrother = child;}}p = p->link;}
}void DFS_Main(Graph *g, Tree *t) {int i;for (i = 0; i < N; i++)g->Head[i].Visited = 0;for (i = 0; i < N; i++) {if (!g->Head[i].Visited) {Tree *root = (Tree *)malloc(sizeof(Tree));root->NextBrother = NULL;root->FirstChild = NULL;DepthForceSearch(g, i, root);*t = *root;}}
}

4. 实验结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress安装AWS插件实现文本转语音功能

适用于 WordPress 的 AWS 插件示例演示了内容创建者如何轻松地为所有书面内容添加文本转语音功能。随着语音搜索的不断增加&#xff0c;以音频格式提供更多网站内容变得至关重要。通过添加语音功能&#xff0c;网站访客可以通过在线音频播放器和播客应用程序等新渠道使用您的内…

ART-PI开发套件-构建开发环境

1、env工具的安装与使用 env 是 RT-Thread 推出的开发辅助工具&#xff0c;针对基于 RT-Thread 操作系统的项目工程&#xff0c;提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的 menuconfig 提供了简单易用的配置剪裁工具&#xff0c;可对内核、组件和软件包进行…

Oracle

1.解释冷备份和热备份的不同点以及各自的优点 冷备份 发生在数据库已经正常关闭的情况下&#xff0c;将关键性文件拷贝到另外位置的一种说法。适用于所有模式的数据库。 优点 是非常快速的备份方法&#xff08;只需拷贝文件&#xff09;容易归档&#xff08;简单拷贝即可&a…

面试常见问题:什么是进程? 什么是线程?进程和线程有什么区别?

1.什么是进程&#xff1f; 进程是操作系统中一个程序在执行过程中的一个实例&#xff0c;每个进程都有自己独立的地址空间&#xff0c;进程间不共享内存。它是程序运行的最小内存单元&#xff1b; 进程特点&#xff1a; 1> 需要占用独立的内存空间&#xff1b; 2>可以并…

贪心 D. Least Cost Bracket Sequence

Problem - D - Codeforces 题目大意&#xff1a;给一个只包含(&#xff0c;)&#xff0c;?三个字符的字符串。每个?可以转为(或者)&#xff0c;对于第 i i i个?转为(需要花费 a i a_i ai​&#xff0c;转为)需要花费 b i b_i bi​。现在问能否让该字符串转为合法的括号匹配…

C语言—冒泡排序

方法一&#xff08;不使用函数解决&#xff09; #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{15,52,23,0,5,6,45,8,9,10};int i0;int j0;for ( i 0; i < 9; i){int flag1; //flag判断数组元素是否有序&#xff0c;这里先假设…

Vue组件库推荐:Ant Design Vue深度解析

Vue.js已经成为了当今最受欢迎的JavaScript框架之一。它简单易学、高效快速&#xff0c;使得开发者能够快速构建出优质的Web应用。然而&#xff0c;随着Vue.js的普及&#xff0c;也涌现出了许多优秀的Vue组件库。其中&#xff0c;Ant Design Vue无疑是最受欢迎的之一。Ant Desi…

VMware虚拟机安装华为OpenEuler欧拉系统

首先去欧拉官方网站下载openEuler的安装镜像&#xff1a; openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 我下载的是最新的23.03长期维护版本&#xff0c;架构选择x86_64。 创建新虚拟机&#xff1a;选择典型配置&#xff0c;点击下一步&#xff1a;选择下载的镜像文…

Android 13.0 Launcher3 app列表页桌面图标按安装时间排序

1.概述 在13.0的系统rom定制化开发中,在对Launcher3进行功能开发时,系统默认的app列表页排序是安装app名称进行排序的, 由于功能的需要要求按照app安装时间进行排序,这就需要找到相关的排序地方,进行排序方式的修改就能完成这个功能 2.Launcher3 app列表页桌面图标按安装…

4.25每日一题(通过被积函数和积分区域(不等式)选正确的坐标系求二重积分)

一、正确画出积分区域&#xff1b;通过积分区域和被积函数选择方法 二、如何根据被积函数和积分区域正确选择通过极坐标还是根据直角坐标方程计算&#xff1a; &#xff08;1&#xff09;适合极坐标的积分区域&#xff1a;圆或者部分圆 &#xff08;2&#xff09;适合极坐标的…

公交路线查询系统

公交路线查询系统 一&#xff1a;目标一&#xff1a;类的定义构造方法 set和get方法&#xff1a;目标二&#xff1a;静态属性 静态方法 toString方法&#xff1a;目标三&#xff1a;抽象类的定义 抽象方法 实际应用&#xff1a;abstract class AbstractRoute{目标四&#xff1…

Hibernate 脏检查和刷新缓存机制

刷新缓存: Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对…

4-Docker命令之docker create

1.docker create介绍 docker create命令是用于创建一个新的容器,等价于docker run -d命令,但是与docker run -d不同的是,docker create创建的容器并未实际启动,需要指定docker start命令启动。 2.docker create用法 docker create [参数] [root@centos79 ~]# docker cr…

VMware OpenSLP漏洞解决方案

PS&#xff1a;早期为客户做VMware检测的方法&#xff0c;大家如有遇到可参考 OpenSLP堆溢出漏洞攻击大量ESXI服务器&#xff0c;该漏洞编号为CVE-2021-21974&#xff0c;由 OpenSLP 服务中的堆溢出问题引起 大于以下版本则不受影响 ESXi versions 7.x prior to ESXi7…

ElasticSearch之文件描述符的数量

ElasticSearch在运行过程中&#xff0c;涉及大量文件的打开、关闭、读、写等操作。因此当ElasticSearch进程的文件描述符数量不足时可能导致丢失数据等故障现象。 因此为保障ElasticSearch正常运行&#xff0c;需保证ElasticSearch可以使用至少65535个文件描述符。 查看Linux系…

Java的内部类

文章目录 静态内部类(被static修饰的成员内部类)--可以实例化!获取静态内部类对象(把它当成外部类的成员)静态内部类可以声明普通成员变量和方法&#xff0c;而普通内部类不能声明static成员变量和方法静态内部类跟静态方法一样&#xff0c;只能访问静态的成员变量和方法&#…

【Java基础系列】文件上传功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

nodejs微信小程序+python+PHP-健身俱乐部在线管理平台的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

RNN 网络结构及训练过程简介

本文通过整理李宏毅老师的机器学习教程的内容&#xff0c;介绍 RNN&#xff08;recurrent neural network&#xff09;的网络结构。 RNN 网络结构, 李宏毅 RNN RNN 的特点在于存储功能&#xff0c;即可以记忆前面时刻的信息。 最简单的 RNN 结构如下&#xff1a; 当然&a…

【数据库设计和SQL基础语法】--数据库设计基础--数据规范化和反规范化

一、 数据规范化 1.1 数据规范化的概念 定义 数据规范化是数据库设计中的一种方法&#xff0c;通过组织表结构&#xff0c;减少数据冗余&#xff0c;提高数据一致性和降低更新异常的过程。这一过程确保数据库中的数据结构遵循一定的标准和规范&#xff0c;使得数据存储更加高…