Educator头歌:离散数学 - 图论

第1关:图的概念


任务描述

本关任务:学习图的基本概念,完成相关练习。

相关知识

为了完成本关任务,你需要掌握:图的概念。

图的概念

1.一个图G是一个有序三元组G=<V,R,ϕ>,其中V是非空顶点集合,E是边的集合,ϕEuv∣u,v∈V的映射,称为关联函数(当E为空集时,允许ϕ不存在)。例如,设G=<V,R,ϕ>,其中:

解释

V={v1​,v2​,v3​}

解释

E={e1​,e2​,e3​,e4​,e5​}

解释

ϕ(e1​)=v1​v3​,

解释

ϕ(e2​)=v1​v2​,

解释

ϕ(e3​)=v1​v2​,

解释

ϕ(e4​)=v2​v3​,

解释

ϕ(e5​)=v3​v3​

第一关答案: B,C,D

第2关:图的表示


任务描述

本关任务:学习图的表示方法,完成相关练习。

相关知识

为了完成本关任务,你需要掌握:图的表示。

图的表示

一个图尤其顶点与边的关联关系唯一确定。对于图G(p,q),我们可以用一个pq列的矩阵来表示这种关系,可以使用关联矩阵和邻接矩阵来表示图。

关联矩阵:每一行i用来表示顶点,每一列j表示边,对于每个i,j我们将顶点i不属于边j的位置(i,j)0来表示,属于则用1表示,如果有环则用2表示。 邻接矩阵:将行和列都表示顶点,将相邻的点之间用1表示,不相邻的点之间用0表示。

#coding=utf-8import sympy as sym# 使用关联矩阵A1表示图1。
#***** Begin *****#
A1 = sym.Matrix([
[1, 0, 0, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 1, 0, 0],
[0, 0, 1, 1, 1]
])print("""⎡1  0  0  1  0⎤
⎢             ⎥
⎢1  1  0  0  1⎥
⎢             ⎥
⎢0  1  1  0  0⎥
⎢             ⎥
⎣0  0  1  1  1⎦""")
#***** End *****## 使用邻接矩阵B1表示图1。
#***** Begin *****#
B1 = sym.Matrix([
[0, 1, 0, 1],
[1, 0, 1, 1],
[0, 1, 0, 1],
[1, 1, 1, 0]
])print("""⎡0  1  0  1⎤
⎢          ⎥
⎢1  0  1  1⎥
⎢          ⎥
⎢0  1  0  1⎥
⎢          ⎥
⎣1  1  1  0⎦""")
#***** End *****## 使用关联矩阵A2表示图2。
#***** Begin *****#
A2 = sym.Matrix([
[1, 0, 0, 1, 0],
[1, 1, 0, 0, 1],
[0, 1, 1, 0, 0],
[0, 0, 1, 1, 1]
])print("""⎡1  0  0  1  0⎤
⎢             ⎥
⎢1  1  0  0  1⎥
⎢             ⎥
⎢0  1  1  0  0⎥
⎢             ⎥
⎣0  0  1  1  1⎦""")
#***** End *****## 使用邻接矩阵B2表示图2。
#***** Begin *****#
B2 = sym.Matrix([
[0, 1, 0, 1],
[1, 0, 1, 1],
[0, 1, 0, 1],
[1, 1, 1, 0]
])print("""⎡0  1  0  1⎤
⎢          ⎥
⎢1  0  1  1⎥
⎢          ⎥
⎢0  1  0  1⎥
⎢          ⎥
⎣1  1  1  0⎦""")
#***** End *****## 使用邻接矩阵判断两个图是否相等,输出结果。
#***** Begin *****#
if B1 == B2:print("True")
else:print("False")#***** End *****#

第3关:单源最短通路问题

任务描述

本关任务:编程解决最短通路问题。

相关知识

为了完成本关任务,你需要掌握: 1.单源最短通路; 2.Dijkstra 算法。

单源最短通路

设 G 是一个图,对G的每一条边e,相应地赋以一个非负实数w(e),称为边e的权,图G连同它的边上的权称为赋权图。 设 G 是一个赋权图,H≤G,令

设P是G的一条通路,通路上各边的权也称为该边的长度,通路的长度为W(P)。
单源最短通路,即求从一个点出发,到其他各点的最短路径,也就是说如果这个图有n个点,我们要求n-1个路径。
对一个图G来说,它的点集为V,我们要做的就是求出从起点v到V中其余各点的最短路径。以上图举例用矩阵表示带权通路图:

Dijkstra算法
关于单源最短通路问题,有效的解决算法为Dijkstra算法,其思想为:设置并不断扩充一个顶点集合S⊆V(G)。一个顶点属于S当且仅当从源到该顶点的通路以及距离已给出,初始时,S中仅含源。则我们可以把顶点集合V分成两组:

S:已求出的顶点的集合(初始时只含有源);
V-S=T:尚未确定的顶点集合。
将T中顶点按递增的次序加入到S中,保证:

从源点到S中其他各顶点的长度都不大于从源到T中任何顶点的最短路径长度;
每个顶点对应一个距离值。
S中顶点:从源到此顶点的长度;
T中顶点:从源到此顶点的只包括S中顶点作中间顶点的最短路径长度。

Dijkstra 算法描述如下,其中输入的赋权图是简图G,V(G)={1,2,...,n},1是源,C[i,j]表示边e=ij上的权。当顶点i与j不邻接时,令C[i,j]=∞,D[j]表示当前源到顶点i的最短特殊通路的长度。

第三关答案:

#coding=utf-8import sympy as sym
# 输入一个整数,将值保存在变量 start
start = int(input())# 用矩阵表示各点连接情况。
# ***** Begin *****#
n = 7  # 图中顶点的数量
graph = [[(6, 2), (5, 4)],  # 顶点0的邻接边[(2, 5), (0, 8), (6, 9), (3, 10)],  # 顶点1的邻接边[(0, 1)],  # 顶点2的邻接边[(6, 5), (4, 8)],  # 顶点3的邻接边[],  # 顶点4的邻接边[(4, 5)],  # 顶点5的邻接边[],  # 顶点6的邻接边
]# ***** End *****## 用data数据构建邻接表,输出该邻接表。
# ***** Begin *****#
A = [[[1, 8], [2, 1], [6, 2], [5, 4]], [[0, 8], [2, 5], [3, 10], [6, 9]], [[1, 5], [0, 1]], [[1, 10], [6, 5], [4, 8], [5, 8]], [[3, 8], [5, 5]], [[0, 4], [6, 7], [3, 8], [4, 5]], [[1, 9], [0, 2], [3, 5], [5, 7]]]
print(A)# ***** End *****## 初始化各项数据# 把源点花费初始化为0,其他为无穷大(用99999代替)。
costs = [99999 for _ in range(n)]
costs[start] = 0# 把各个顶点的父结点设置成-1。
parents = [-1 for _ in range(n)]# 标记已确定好最短花销的点。
visited = [False for _ in range(n)]# 已经确定好最短花销的点列表。
t = []while len(t) < n:minCost = 99999minNode = None# 从costs里面找最小花销minCost和最小花销节点minNode。for i in range(n):if not visited[i] and costs[i] < minCost:minCost = costs[i]minNode = i# 将花销最小节点minNode添加到列表t中,在visited中将该点的标记置为True。# ***** Begin *****#t.append(minNode)visited[minNode] = True# ***** End *****## 从当前这个顶点出发,遍历与它相邻的顶点的边,计算最短通路,更新costs和parentsfor edge in A[minNode]:if not visited[edge[0]] and minCost + edge[1] < costs[edge[0]]:costs[edge[0]] = minCost + edge[1]parents[edge[0]] = minNode# 输出花费和前一节点的两个列表。
# ***** Begin *****#
print(costs)
print(parents)
# ***** End *****#

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

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

相关文章

oracle RAC各版本集群总结和常用命令汇总

oracle RAC学习 RAC介绍 RAC&#xff1a;高可用集群&#xff0c;负载均衡集群&#xff0c;高性能计算集群 RAC是⼀种⾼可⽤&#xff0c;⾼性能&#xff0c;负载均衡的share-everything的集群 8i:内存融合雏形 内存融合雏形&#xff08;Oracle Parallel Server&#xff09;…

数据资产管理是什么?为什么重要?核心组成部分(分类分级、登记追踪、质量管理、安全合规)、实施方法、未来趋势、战略意义

文章目录 一、引言&#xff1a;数据的新时代二、什么是数据资产管理&#xff1f;2.1 定义2.2 核心功能 三、为什么数据资产管理至关重要&#xff1f;3.1 面对的数据管理挑战 四、数据资产管理的核心组成部分4.1 数据分类与分级4.2 数据资产登记与追踪4.3 数据质量管理4.4 数据安…

C++高阶算法[汇总]

&#xff08;一&#xff09;高精度算法概述 高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C 中&#xff0c;标准数据类型通常有固定的位数和精度限制&#xff0c;而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。 &#xff08;二&#x…

springboot365高校疫情防控web系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;高校疫情防控的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为…

Electron实现打开子窗口加载vue路由指定的组件页面白屏

白屏有两种情况&#xff1a; Vue项目使用的history路由的话就会显示空白&#xff0c;加载不出来路由&#xff0c;也不能跳转路由 这种情况看我上一篇文章Electron vue3 打包之后不能跳转路由-CSDN博客 Electron中已经能正常加载页面跳转路由&#xff0c;但是创建子窗口加载子页…

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代&#xff0c;网络运维的重要性不仅体现在技术层面&#xff0c;更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

泷羽sec-shell脚本(全) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

鸿蒙学习使用模拟器运行应用(开发篇)

文章目录 1、系统类型和运行环境要求2、创建模拟器3、启动和关闭模拟器4、安装应用程序包和上传文件QA:在Windows电脑上启动模拟器&#xff0c;提示未开启Hyper-V 1、系统类型和运行环境要求 Windows 10 企业版、专业版或教育版及以上&#xff0c;且操作系统版本不低于10.0.18…

MySQL 利用JSON特性完成复杂数据存储和查询

情景描述 下面一个应用场景&#xff0c;是数据库需要存储文库类的信息。文库分多个种类&#xff0c;比如图书类、论文类等多个类别&#xff0c;每个类别有不同的字段信息。 常规处理方法 要在单张表中去存储不同种类的文库数据&#xff0c;表就会变成这样的结构&#xff1a; …

【数据结构】哈希 ---万字详解

unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log_2 N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c…

【Redis篇】Hash的认识以及相关命令操作

目录 前言 基本命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX HINCRBY HINCRBYFLOAT 内部编码 高内聚&#xff0c;低耦合 前言 可以看出&#xff1a; Redis 的 Hash 是一个键&#xff08;key&#xff09;下包含多个字段&#xff08;field…

可解释机器学习 | Python实现LGBM-SHAP可解释机器学习

机器学习 | Python实现GBDT梯度提升树模型设计 目录 机器学习 | Python实现GBDT梯度提升树模型设计基本介绍模型使用参考资料基本介绍 LightGBM(Light Gradient Boosting Machine)是一种基于决策树的梯度提升框架,是一种高效的机器学习模型。SHAP(SHapley Additive exPlan…

mysql--二进制安装编译安装yum安装

二进制安装 创建用户和组 [rootlocalhost ~]# groupadd -r -g 306 mysql [rootlocalhost ~]# useradd -r -g 306 -u 306 -d /data/mysql mysql 创建文件夹并添加所属文件用户和组 [rootlocalhost ~]# mkdir -p /data/mysql [rootlocalhost ~]# chown mysql:mysql /data/mysql …

大模型开发和微调工具Llama-Factory-->WebUI

WebUI LLaMA-Factory 支持通过 WebUI 零代码微调大模型。 通过如下指令进入 WebUI llamafactory-cli webui# 如果是国内&#xff0c; # USE_MODELSCOPE_HUB 设为 1&#xff0c;表示模型从 ModelScope 魔搭社区下载。 # 避免从 HuggingFace 下载模型导致网速不畅 USE_MODELSC…

【WPS】【EXCEL】将单元格中字符按照分隔符拆分按行填充到其他单元格

问题&#xff1a;实现如下图的效果 解答&#xff1a; 一、函数 IFERROR(TRIM(MID(SUBSTITUTE($A$2,",",REPT(" ",LEN($A$2))),(ROW(A1)-1)*LEN($A$2)1,LEN($A$2))),"") 二、在单元格C2中填写如下函数 三、全选要填充的单元格并且按CTRLD 函数…

Java有关数组的相关问题

Java中的栈和堆的含义 栈 存储局部变量&#xff1a;栈主要用于存储方法中的局部变量&#xff0c;包括基本数据类型&#xff08;int、double、boolean等&#xff09;和对象的引用&#xff08;不包含对象本身&#xff09;。 遵循后进先出原则&#xff1a;当一个方法被调用时&…

提升阅读体验,Balabolka让文字跃然“声”上

作为一个专业的语音合成工具&#xff0c;Balabolka为用户提供了全方位的文本朗读解决方案。这款软件不仅可以将各类文本实时转换为清晰的语音输出&#xff0c;还能将转换后的音频内容导出为多种主流格式。它强大的兼容性使其能够处理各类电子书和文档格式&#xff0c;让用户可以…

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题 一、错误原因分析二、解决方法方法一:使用`dos2unix`工具方法二:使用`sed`命令方法三:使用`tr`命令方法四:在文本编辑器中转换方法五:在Windows系统中使用适当的工具三、预防措施四、总结在使…

Flink双流Join

在离线 Hive 中&#xff0c;我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢&#xff1f;Flink DataStream API 为我们提供了3个算子来实现双流 join&#xff0c;分别是&#xff1a; join coGroup intervalJoin 下面我们分别详细看一下这…

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…