实验五 网络中的树

news2025/1/10 17:16:14

文章目录

  • 5.1 网络中的树
    • 第一关 认识树
      • 相关知识
      • 编程要求
      • 代码文件
    • 第2关 根节点的二阶邻居求解方法
      • 相关知识
      • 编程要求
      • 代码文件
    • 第3关 根节点的n阶邻居求解方法
      • 相关知识
  • 5.2 权值矩阵与环(无向网络)
    • 第1关 无向网络的权值矩阵
      • 相关知识
      • 编程要求
      • 代码文件
    • 第2关 无向网络中环的判定一
      • 相关知识
      • 编程要求
    • 第3关 无向网络中环的判定二
      • 相关知识
      • 编程要求
      • 代码文件

5.1 网络中的树

第一关 认识树

相关知识

一个包含N个节点的连通图G至少含有N-1条边,如果这个连通图恰好只有N-1条边,那么这个图就可以看做是最简单的连通图,我们称之为树(tree)。一个包含了N个节点的无向图G称为一棵树,当且仅当它满足如下任意一个条件:

  • 图G是连通的并且有N-1条边;
  • 图G是连通的并且不包含圈;
  • 图G不包含圈并且有N-1条边;
  • 图G中任意两个顶点之间有且仅有一条路径
  • 图G中任意一条边都是桥,即去掉图G中任意一条边都会使图变得不连通

编程要求

  • 根据下图所示的树型网络,理清节点间连接关系及其方向权重信息;
  • 再将对应的邻接矩阵G、邻接链表edges以及关联矩阵M在程序空白处输入,元素间请以空格作为间隔;
  • 将得到的邻接矩阵G、邻接链表edges以及关联矩阵M由disp命令完成。

在这里插入图片描述

代码文件

%Output the G, edges and M, respectively.
G = [0 1 1 1 0 1;1 0 0 0 0 0;1 0 0 0 0 0;1 0 0 0 1 0;0 0 0 1 0 0;1 0 0 0 0 0];
edges = [1 2;1 3;1 4;4 5;1 6];
M = [1 1 1 1 0;1 0 0 0 0;0 1 0 0 0;0 0 1 0 1;0 0 0 0 1;0 0 0 1 0];
disp(G);
disp(edges);
disp(M);

第2关 根节点的二阶邻居求解方法

相关知识

首先在这样一棵树中,我们以节点1作为树的根节点,然后我们每次在向量a中存放已搜索到的根节点邻居,a_temp存放当前搜索到的新邻居。我们知道树的邻接矩阵中非零元素代表节点之间存在连边,那么我们首先定位到邻接矩阵根节点1对应的行,使用find命令找出该行的非零元素位置,并将其存放在向量a_temp中。

a_temp = find(G(1,:));

其中G(1,:)代表邻接矩阵G中第一行的所有元素,利用find命令便可以找出第一行中所有的非零元素的索引值,我们可以看到,根节点1的一阶邻居为节点2,3,4,6。然后我们再以for循环遍历这四个节点的一阶邻居,与根节点一阶邻居不重合的节点便是根节点的2阶邻居。

a = a_temp;
l = length(a_temp);
neighbor = [];
for i = 1:l;
    a_temp = find(G(a(i),:));
    neighbor = union(setdiff(a_temp,a),neighbor);
end

我们首先是求出一阶邻接的数目,然后利用for循环,遍历根节点的每一个一阶邻居,将其二阶邻居节点与已求得的一阶邻居取差集setdiff,便能准确求出专属于二阶邻居的所有节点。

neighbor = setdiff(neighbor,1);
disp(neighbor);

编程要求

在这里插入图片描述

代码文件

%Output the neighbor.
G = [0 1 1 1 0 0 0 0;1 0 0 0 1 1 0 0;1 0 0 0 0 0 1 0;1 0 0 0 0 0 0 1;0 1 0 0 0 0 0 0;0 1 0 0 0 0 0 0;0 0 1 0 0 0 0 0;0 0 0 1 0 0 0 0];
a_temp = find(G(1,:));
a = a_temp;
%disp(a_temp); 输出2 3 4
l = length(a_temp);
neighbor = [];
for i = 1:l;
    a_temp = find(G(a(i),:));
    neighbor = union(setdiff(a_temp,a),neighbor);
end
neighbor = setdiff(neighbor,1);
disp(neighbor);

第3关 根节点的n阶邻居求解方法

相关知识

先求出树型网络的二阶邻居,如下所示:

a = a_temp;
l = length(a_temp);%计算根节点一阶邻居的数目
neighbor = [];
for i=1:l
    a_temp = find(G(a(i),:));
    neighbor = union(setdiff(a_temp,a),neighbor);
end

现在讲所求得的邻居节点存入一个临时变量,然后继续遍历二阶邻居的邻居节点,即根节点的三阶邻居,再与临时变量求一个差集即可求得根节点的三阶邻居节点。首先在这样一棵树中,我们以节点1作为树的根节点,然后我们每次在向量a中存放已搜索到的根节点邻居,a_temp存放当前搜索到的新邻居,而不包含前序搜索节点的邻居节点存放在neighbor中。使用find命令找出该行的非零元素位置,并将其存放在向量a_temp中。其中G(a_location(i),:)代表邻接矩阵G中与当前搜索的邻居节点相关的矩阵行中的所有元素,利用find命令便可以找出第一行中所有的非零元素的索引值,然后我们再以for循环遍历这几个节点的一阶邻居,与上一阶节点不重合的节点便是根节点的下一阶阶邻居,求取不重合的节点集我们采用setdiff差集命令,便可最终得到根节点的n阶邻居,如下:

n = 3;%设定根节点的n阶邻居
a = [1];%a为搜索到的节点集合,初始化搜索到的节点集合
a_num = 1;%初始化搜索到的节点数目
neighbor = [];%初始化邻居
k = 1;%循环的控制参数初始化
l = 1;%初始化下一步需要搜索的邻居节点数目
a_location = a;%搜索的定位向量
while k ~= (n+1)
	neighbor = [];
	for i = 1:l
		a_temp = find(G(a_location(i),:));%搜索上一阶邻居的所有相邻节点
		neighbor = union(setdiff(a_temp,a),neighbor);%与当前已搜索到的所有节点取差集,即得到当前阶次的邻居
	end
	a = union(neighbor,a);%更新搜索到的节点集合
	l = length(neighbor);%更新下一步需要搜索的邻居节点数目
	a_location = neighbor;%更新定位向量
	k = k+1;%更新循环的控制参数
end

5.2 权值矩阵与环(无向网络)

第1关 无向网络的权值矩阵

相关知识

编程要求

  • 根据下图所示网络图,理清节点间连接关系及其方向权重信息;
  • 再将对应的权值矩阵在程序空白处输入,元素间请以空格作为间隔;
  • 将得到的权值矩阵由disp命令完成。

在这里插入图片描述

代码文件

%Output matrix to A.
A = [0 0 0 0 0;1 0 0 1 0;0 5 0 0 6;0 0 4 0 0;0 0 0 0 0];
disp(A);

第2关 无向网络中环的判定一

相关知识

邻接矩阵每个元素的含义就是如果节点对之间有连边则对应位置的元素值为1,所以我们只需要计算邻接矩阵所有行中非零元素为1的行,便能很快锁定相关节点并进行删除。

sum (G);
a = find(sum(G) == 1);

接下来便是删除操作,如下所示,我们首先计算变量a中节点的数目,利用for循环对选中的节点利用****G(a(i),:)=[]和 G(:,a(i))=[]****指令进行逐一的行列删除。

l=length(a); %如果不止一个节点只含有一条边,求取该类节点的数目
for i=1:l
    G(a(i),:)=[]; %删除节点的对应行
    G(:,a(i))=[]; %删除节点的对应列
end

最后我们再判断是否还有节点只含有一条边,将上面的代码进行整理并加入while循环来控制算法是否终止,因为在实际问题中,网络规模往往很大,所以不可能剥除一次就能将网络中所有只含一条边的节点删除,有可能在一次剥除之后,会产生新的只含一条边的节点,如下图所示,每次循环结束后,用sum计算一次矩阵中是否存在按列求和值为1的节点,如果有则继续进行循环操作,如果没有,则满足算法终止条件,用setdiff差集命令输出环中的节点。

编程要求

  • 根据下图所示网络图,理清节点间连接关系及其方向权重信息;
  • 再将对应的邻接矩阵矩阵在程序空白处输入,元素间请以空格作为间隔;
  • 利用本关卡所学的指令求解网络中环所包含的节点,并存入round;
  • 将得到的环中节点由disp命令完成。
    在这里插入图片描述

第3关 无向网络中环的判定二

相关知识

如果一个网络含有环,其总的边数肯定是大于或者等于节点数目,即m>=n,那么我们其实只需要求出网络中的边数与节点数目,便能轻松判定网络中是否存在环。
利用size命令求出网络的尺寸,由于无向网络邻接矩阵是对称矩阵,所以其网络尺寸也就是节点数目,然后利用triu命令求网络的上三角矩阵,再对其整体求和,便能得到边数。我们可以发现边数5=节点数5,说明网络中含环。

编程要求

  • 根据下图所示网络图,理清节点间连接关系及其方向权重信息;
  • 再将对应的邻接矩阵矩阵在程序空白处输入,元素间请以空格作为间隔;
  • 利用本关卡所学的指令求解网络中节点与边的数目;
  • 利用if语句判断是否存在环,如果存在则输出1,不存在则输出0,并将结果由disp命令输出。

在这里插入图片描述

代码文件

A = [0 1 1 0 0 0 0;1 0 0 0 1 0 0;1 0 0 1 0 1 0;0 0 1 0 0 0 0;0 1 0 0 0 1 0;0 0 1 0 1 0 1;0 0 0 0 0 1 0];
n = size(A,1);
A1 = triu(A);
m = sum(A1);
m = sum(m);
if m == n
    disp(1);
end
if m ~= n
    disp(0);
end

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

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

相关文章

CrossOver 2024软件下载-CrossOver 2024详细安装教程

Crossover软件是一款可以在Mac、Linux和Chromebook上运行Windows程序的软件。 它是一款商业软件,由CodeWeavers公司开发,Crossover不是一个虚拟机或模拟器,它使用Wine技术来将Windows程序直接转换成可以在其他操作系统上运行的程序&#xff0…

基于SpringBoot3+Vue3宠物小程序宠物医院小程序的设计与实现

大家好,我是程序员小孟。 最近开发了一个宠物的小程序,含有详细的文档、源码、项目非常的不错! 一,系统的技术栈 二,项目的部署教程 前端部署包:npm i 启动程序:npm run dev 注意事项&…

HSP_07章 排序和查找

P96_ 冒泡排序 排序的基本介绍 冒泡排序介绍 冒泡排序思路分析 代码 # 说明,如果只是完成排序功能,我们可以直接使用list的方法sort # 排序的列表 num_list[24,69,80,57,13,0,900,-1] print("排序前".center(32,"-")) print(f"num_list: {num_list}…

Ceph入门到精通-Bucket 生命周期的作用,新手该如何设置?

存储桶(Bucket)生命周期策略的作用主要是帮助存储管理员高效地管理对象的存储周期,包括对象的转换、存档和删除。以下是关于桶生命周期的作用和配置的概述: 一、桶生命周期的作用: 存储优化:通过将对象转换到更经济的存储类别,降低存储成本。 数据管理:自动删除不再需…

交换机简介

一、 集线器的替代品—交换机 使用集线器的缺点,因此就设计出了交换机来代替集线器,交换机常见端口数量一般有4、8、16、24、32等数量。 华为交换机:S5720-HI系列 仅从实物图上来看,交换机和集线器非常的像,但是它们的…

Python第二语言(十一、Python面向对象(下))

目录 1. 封装 1.1 私有成员:__成员、__成员方法 2. 继承:单继承、多继承 2.1 继承的基础语法 2.2 复写 & 子类使用父类成员 3. 变量的类型注解:给变量标识变量类型 3.1 为什么需要类型注解 3.2 类型注解 3.3 类型注解的语法 3.…

visio添加表格

插入Excel表格: 打开Microsoft Visio,新建一个空白画布。点击菜单栏中的“插入”。在插入中点击“图表”。在弹出的插入对象设置页面中选择“Microsoft Excel工作表”。点击确定按钮,然后在表格中输入内容。将鼠标点击到画布的空白处&#x…

大数据在商业中的应用——Kompas.ai如何助力企业决策

引言 在现代商业中,大数据逐渐成为企业决策的重要工具。通过对海量数据的分析和处理,企业可以获得重要的市场信息和决策支持。本文将探讨大数据在商业中的应用,并介绍Kompas.ai如何通过AI技术助力企业决策。 大数据的发展及其重要性 大数据…

迅狐跨境商城系统|全平台兼容|前端采用uni-app跨端框架,后端采用ThinkPHP5框架

高效实现全平台兼容的迅狐跨境商城系统 迅狐跨境商城系统是一款专为跨境电商企业设计的全平台兼容系统。其前端采用uni-app跨端框架,后端采用ThinkPHP5框架,旨在实现高效的开发和运营管理。 1. 全平台兼容的前端设计 迅狐跨境商城系统的前端采用uni-a…

MathType7.6永久免费功能强大的数学公式编辑器

亲爱的科技博主们,今天我要给大家种草一个神奇的工具——MathType 7.6!🧮✨ 作为一名科技博主,我经常需要处理各种复杂的数学公式和符号。以前我总是为这个问题烦恼不已,但是自从我发现了MathType 7.6,一切…

语义分割和目标检测的关系

目录 1.语义分割的目标 2.目标检测的目标 3.两种任务的异同之处 从大方向的任务特点上来说 (1)物体的位置 (2)物体的分类 从数据格式来说 (1)语义分割的数据格式 (2)目标检测的数据格式 1.语义分…

AVR晶体管测试仪开源项目编译

AVR晶体管测试仪开源项目编译 📍原项目地址:https://github.com/Mikrocontroller-net/transistortester/tree/master🌿 https://github.com/svn2github/transistortester🌿 https://github.com/wagiminator/ATmega-Transistor-Tes…

python 只有ListNode类的情况下,创建链表和遍历链表

class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextif __name__ __main__: linklist dummy ListNode() for x in ([2,4,3]): linklist .next ListNode(x) linklist linklist .nextwhile dummy:print(dummy.val)dummy dummy.next 这里的…

互联网应用主流框架整合之SpringMVC基础组件开发

多种传参方式 在前一篇文章互联网应用主流框架整合之SpringMVC初始化及各组件工作原理中讨论了最简单的参数传递,而实际情况要复杂的多,比如REST风格,它往往会将参数写入请求路径中,而不是以HTTP请求参数传递;比如查询…

云渲染动画:C4D如何正确渲染导出动画?

​C4D是一款功能强大的3D建模、动画和渲染软件,在制作动画时,正确的渲染和导出流程至关重要,以确保动画质量和流畅性。 帧率概念 动画就是一幅幅图片连贯起来,30帧/秒,就是一秒出现30张图片一般国外都是30&#xff0c…

2024年6.18有必要购买正版FL Studio21吗?

对于是否需要购买FL Studio的正版软件,我们认为强烈推荐用户购买正版软件,而不是使用盗版软件。 FL Studio 21是一款功能强大的音乐编曲制作软件。尽管你可能没有接触过音乐制作,也能通过fl Studio 21,撰写,整理&#…

3dmax在设计3D模型时闪退解决方法---模大狮模型网

3ds Max 在设计 3D 模型时闪退可能由多种原因造成,以下是一些常见的解决方法: 更新显卡驱动程序: 一个过时或不稳定的显卡驱动程序可能导致 3ds Max 闪退。请确保你的显卡驱动程序是最新版本,并且与 3ds Max 兼容。 关闭不必要的…

轻易云-轻企AI知识库的智能创作与个性化管理

随着人工智能技术的飞速发展,AI助手正逐渐成为我们生活和工作中不可或缺的伙伴。轻易云AI助理,作为这一领域的佼佼者,以其无所不知、无所不能的AI创作模型,为用户带来了前所未有的智能体验。 一、AI创作模型的丰富性 在轻易云AI助…

CG-85D 振弦式渗压计厂家 测量孔隙水压力或液位

产品概述 振弦式渗压计适合埋设在水工建筑物和基岩内,或安装在测压管、钻孔、堤坝、管道或压力容器中,以测量孔隙水压力或液位。主要部件均采用特殊钢材制造,适合在各种恶劣环境中使用。特殊的稳定补偿技术使传感器具有极小的温度补偿系数。…

Python学习从0开始——Kaggle时间序列001

Python学习从0开始——Kaggle时间序列001 一、具有时间序列的线性回归1.时间序列2.时间序列线性回归1.时间步特征2.滞后特征 二、趋势1.介绍2.移动平均图3.设计趋向4.使用 三、季节性1.介绍2.季节图和季节指标季节性的指标 3.傅里叶特征和周期图用周期图选择傅里叶特征计算傅里…