实验五 网络中的树

文章目录

  • 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:la_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:la_temp = find(G(a_location(i),:));%搜索上一阶邻居的所有相邻节点neighbor = union(setdiff(a_temp,a),neighbor);%与当前已搜索到的所有节点取差集,即得到当前阶次的邻居enda = 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:lG(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 == ndisp(1);
end
if m ~= ndisp(0);
end

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

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

相关文章

【机器学习】神经网络与深度学习:探索智能计算的前沿

前沿 神经网络:模拟人类神经系统的计算模型 基本概念 神经网络,又称人工神经网络(ANN, Artificial Neural Network),是一种模拟人类神经系统结构和功能的计算模型。它由大量神经元(节点)相互连…

docker环境中配置phpstorm php xdebug调试工具

本文介绍通过docker compose的使用方式 第一步:在php镜像中安装phpxdebug扩展,比如php7.4对应的是xdebug3.1.6 第二步:设置项目中的docker-compose.yml docker-compose 增加开启xdebug的环境变量,host.docker.internal是宿主机的地址&#…

Kettle根据分类实现Excel文件拆分——kettle开发31

将整理好的一份供应商付款明细Excel文件,按供应商拆分成多个Excel文件。 实现思路 本文我们首先将供应商付款明细表,按照“名称”拆分成多份Excel文件。拆分Excel文件打算用两个转换实现,一个用来将Excel数据读取到参数中,另外一…

Internet Download Manager(IDM6.41)安装教程+软件安装包下载

IDM是一款多线程下载工具,全称InternetDownloadManager。IDM的多线程加速功能,能够充分利用宽带,所以下载速度会比较快,而且它支持断点续传。它的网站音视频捕获、站点抓取、静默下载等功能,也特别实用。 安 装 包 获 …

图像的几何变换之平移

文章目录 前言需求代码运行结果图 前言 图像的几何变换是一个再基础不过的知识点,包括等距变换,相似变换,仿射变换和投影变换。图像的几何变换是指对图像的位置,尺寸,大小,形状和投影进行变换,…

采集设置记录

采集设置: 1.任务添加 2.采集器设置 采集器设置之规则采集

OpenCV滤波器

滤波的作用 一副图像通过滤波器得到另一副图像;其中滤波器又称为卷积核,滤波的过程称为卷积。 图像卷积效果图 卷积的过程 一 卷积的几个基本概念 1 卷积核的大小 卷积核一般为奇数,如3X3,5X5,7X7等。 一方面是增加padding的原因。 另一…

activiti(一)-相关概述及相关表的定义

官网 1、概述 Activiti 是一个开源的、以 Java 为中心的业务流程管理(BPM)平台,旨在帮助企业自动化和管理复杂的业务流程。其核心功能包括工作流管理、任务分配、事件处理、流程监控和集成等。 1.1、主要功能和特点 流程设计和建模&#…

GaussDB技术解读——GaussDB架构介绍(三)

目录 9 智能关键技术方案 智能关键技术一:自治运维系统 智能关键技术二:库内AI引擎 智能关键技术三:智能优化器 10 驱动接口关键技术方案 GaussDB架构介绍(二)从数据持久化存取层(DataNode)关键技术方案、全局事…

Druid未授权访问漏洞修复

前言 安全组针对系统漏扫发现系统存在Druid未授权访问,会引发泄露系统敏感信息,漏洞链接为ip:端口/druid/index.html,可以清楚的查看数据库的相关连接信息,如下图所示: 漏洞修复 1、关闭Druid监控页面 在Druid的配…

右值引用和移动语义

什么是左值?什么是右值? 通俗来讲,可以出现在赋值语句左侧的,为左值;只能出现在赋值语句右侧的,为右值。 左值与右值的本质区别在于:左值能取地址,但右值不能。 本文主要通过三个场景…

使用星鸾云GPU云服务器搭配Jupyter Lab,创建个人AI大模型

最近我们公司IT部门宣布了一个大事情,他们开发了一款内部用的大模型,叫作一号AI员工(其实就是一个聊天机器人),这个一号员工可以回答所有关于公司财务、人事、制度、产品方面的问题。 我问了句:公司加班有…

GMT6绘制北半球

设置绘制区域及投影方式 投影方式选择立体等角投影,在GMT6中的命令是-Js # 定义区域变量和投影变量,纬度从北纬30度到极点 region-180/180/30/90 projection0/90/1:60000000 gmt set PROJ_ELLIPSOID WGS-84定义CPT及地形展示 现在定义一个CPT用于显示…

欧式家居官网源码系统-轻奢大气设计风格

一款家居家私的官方网站系统,设计轻奢大气。 前端内容均可通过后台修改。当然你也可以用于其他行业的官网使用,只要你喜欢这个设计。 大致功能: 1、会员系统 2、支付功能 3、标签功能 4、熊掌号提交功能 5、文章发布功能 6、SEO设置功能 7、多…

[学习笔记] VFX Silhouette

目录 Part 1 : The interface of Silhouettte (Silhouette的界面介绍) Part 2: The shape divisions and manual roto(形状分区和手动roto工作): Part 3: tracking : Part 4: Mocha Tracking Part 5: Motion Blur(…

【单片机毕业设计选题24004】-基于STM32和阿里云的智能鱼缸控制系统

系统功能: 此设计采用STM32单片机将采集到的环境温度,TDS值,PH值等显示在OLED上,并将这些信息上报至阿里云平台。系统可通过阿里云平台或按键开关加热继电器,增氧继电器,水泵继电器和舵机. 主要功能模块原理图: 电源时钟烧录接口: 单片机和按键输入电路: 继电器控…

vscode插件开发之 - menu配置

上一遍博客介绍了如何从0到1搭建vscode插件开发的base code,这遍博客将重点介绍如何配置menu。通常,开发一款插件,会将插件显示在VSCode 左侧的活动栏(Activity Bar),那么如何配置让插件显示在Activity Bar…

香橙派鲲鹏Pro(orange pi kunpeng) 开箱测试,和在娱乐功能(电视盒子),深度机器学习应用方面的测试报告

摘要 对Orange Pi kunpeng这个开发板进行综合评测,特别关注其作为电视盒子的性能以及在深度学习应用中的算力和稳定性。通过一个月的测试,我们评估了其硬件性能、软件兼容性、用户体验和实际应用潜力 引言 5月份,我收到了csdn 对Orange P…

LabVIEW阀性能测试平台

项目背景 公司需要开发一套综合测试平台,用于测试汽车气压制动系统控制装置和调节装置的性能。测试平台需满足QC/T标准,并实现多项测试功能,包括密封性测试、静特性测试、动态特性测试等。公司要求系统基于LabVIEW开发,以便于与现…

C++ 06 之 c++增强

c06c增强.cpp #include <iostream>using namespace std; // 1、全局变量检测增强&#xff1a;可以检测出重定义 (c语言不会报错&#xff0c;但是C会报错) //int a; //int a 10;// 2、函数检测增强: 函数返回值类型、形参类型、实参个数 int sum(int a, int b) {return …