【数据结构实验】图(三)图的深度优先搜索(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;可对内核、组件和软件包进行…

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

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

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;这里先假设…

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

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

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语句,将对…

VMware OpenSLP漏洞解决方案

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

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…

最新AI创作系统ChatGPT系统运营源码,支持GPT-4图片对话能力,上传图片并识图理解对话,支持DALL-E3文生图

一、AI创作系统 SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypescript框架技术&#xff0c;持续集成AI能力到本系统。支持OpenAI DALL-E3文生图&#xff0c;…

Canvas艺术之旅:探索锚点抠图的无限可能

说在前面 在日常的图片处理中&#xff0c;我们经常会遇到需要抠图的情况&#xff0c;无论是为了美化照片、制作海报&#xff0c;还是进行图片合成。抠图对于我们来说也是一种很常用的功能了&#xff0c;今天就让我们一起来看下怎么使用canvas来实现一个锚点抠图功能。 效果展示…

【数据结构实验】查找(一)基于散列表的查找算法

文章目录 1. 引言2. 实验原理2.1 散列表2.2 线性探测法2.3 冲突解决 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现3.3 代码整合 4. 实验结果 1. 引言 本实验将通过C语言实现基于散列表的查找算法 2. 实验原理 …

Django 通过 Trunc(kind) 和 Extract(lookup_name) 参数进行潜在 SQL 注入 (CVE-2022-34265)

漏洞描述 Django 于 2022 年6月4 日发布了一个安全更新&#xff0c;修复了 Trunc&#xff08;&#xff09; 和 Extract&#xff08;&#xff09; 数据库函数中的 SQL 注入漏洞。 参考链接&#xff1a; Django security releases issued: 4.0.6 and 3.2.14 | Weblog | Djang…

在 Linux 中重命名文件和目录

目录 前言 使用 mv 命令重命名文件和目录 通过组合 mv、find 和 exec 命令重命名与某个模式匹配的多个文件 使用 rename 命令轻松重命名多个文件 总结 前言 在这篇基本命令行教程中&#xff0c;你将学习在 Linux 终端重命名文件和目录的各种方法。 如何在 Linux 终端中重命…

Vue框架学习笔记——键盘事件

文章目录 前文提要键盘事件&#xff08;并不是所有按键都能绑定键盘事件&#xff09;常用的按键不同的tab和四个按键keyCode绑定键盘事件&#xff08;不推荐&#xff09;Vue.config.keyCode.自定义键名 键码 神奇的猜想div标签和click.enterbutton标签和click.enter 前文提要 …

基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码

基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于卷积优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于卷积优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…