【数据结构周周练】029 判断无向图是否为一棵树算法原理详解及代码分享

本文主要是介绍【数据结构周周练】029 判断无向图是否为一棵树算法原理详解及代码分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

设计一个算法,判断一个图G是否为一棵树,如果是,返回TRUE,否则,返回FALSE。

二、美丽的星座

星座真的好美好美。特别是当人类给它们赋予含义的那一刻,更美,仿佛有了灵魂一般。

 是不是很美,是不是?你以为我是让你过来看星星的吗?你以为我是希望你以后能够好好学习天文学知识的吗?当然不仅仅是这样啦!细心的你应该知道星星多么像我们学的图啊!!!

三、分析

敲黑板!!!

看题了嗨,学习完了我们可以一起畅游星空哈,现在回来我们的重心,看下面这两个星座,为了方便观看,研究其特性,我们放小一点,它们不仅仅是一个星座,同样它们也是一个图,同样它们也是一棵树,也就是说这两个图都是一棵树,那它们有什么特点呢?

该无向图是一棵树

 第一个图有 7颗星星,相当于有三个顶点,星星之间有  6条连线,相当于有  6条边;

第二个图有11颗星星,相当于有11个顶点,星星之间有10条连线,相当于有10条边。

这是树的特性,有n个顶点,就会有n-1条边,且每个顶点都有边相连。即一个图是一棵树的条件是:有n个顶点,就会有n-1条边且每个顶点都有边相连

所以我们的算法就在于判断当我们遍历完图之后,我们是否访问完所有的结点,并且,访问的结点的条数是结点个数-1。

当然,如果我们采用邻接表存储的图,那每一条边都会访问两次,也就是说,我们访问边的次数是边数的两倍。

第一步,遍历图之前的操作

我们遍历图,因为我们要做判断,判断结点是否被访问,被访问说明图中有环,就不是树,所以我们需要定义一个数组来保存结点访问情况,并设置所有值为false,当访问结点后,该结点对应的数组位置的元素改为true。

for (int i = 0; i < G.vexnum; i++) //将所有的访问状态设置为false,即未访问。visited[i] = false;

并且我们要判断访问的边以及结点数量,如果结点访问的数量同图中结点数量一致,并且访问过的边的次数是顶点个数减一的两倍,说明是一棵树,所以我们还需要设置两个变量,用来存储访问结点次数以及访问边的次数。

int VNum = 0;//访问的顶点的数量
int ENum = 0;//访问的边的数量

第二步,遍历图

遍历图我们采用递归算法,为了方便,我们单独写一个遍历算法DFS,即深度优先遍历图(Depth-First-Search)。遍历过程中,每遍历一次,将一个结点的访问改为true,顶点数目+1。

visited[v] = true;//做访问标记
VNum++; //顶点计数+1

 然后获取当前结点,即v结点的第一个邻接点,如果存在,说明有一条边存在,即需要边的数量+1,然后访问v结点的第一个邻接点,如果该邻接点未访问,则继续递归访问,如果访问过了,则访问下一个邻接点。

int w = FirstNeighbor(G, v);
while (w!=-1)
{ENum++;if (!visited[w])DFS(G, v, VNum, ENum, visited);w = NextNeighbor(G, v, w);
}

第三步,做判断

如果满足遍历的定点数与图的顶点数相同并且访问的边数和等于顶点数-1的两倍,则说明是树,否则不是树。

	if (VNum == G.vexnum&& ENum == 2 * (G.vexnum - 1))return true;elsereturn false;

四、全部代码

刚才上面是分析,为了便于大家理解,我将分析对应的代码也写上去了,为了方便大家整体分析,接下来我将所有的代码分享一下。

bool GraphIsTree(Graph &G) {for (int i = 0; i < G.vexnum; i++){visited[i] = false;}int VNum = 0;int ENum = 0;if (VNum == G.vexnum&& ENum == 2 * (G.vexnum - 1))return true;elsereturn false;
}void DFS(Graph &G, int v, int &VNum, int &ENum, int visited[]) {visited[v] = true;VNum++;int w = FirstNeighbor(G, v);while (w!=-1){ENum++;if (!visited[w])DFS(G, v, VNum, ENum, visited);w = NextNeighbor(G, v, w);}
}

大家有什么问题在下面留言哦!!!

这篇关于【数据结构周周练】029 判断无向图是否为一棵树算法原理详解及代码分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295401

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业