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,一经查实,立即删除!

相关文章

OD E卷 - 实现 【虚拟理财游戏】

题目 在一款虚拟游戏中生活&#xff0c;必须进行投资以增强在虚拟游戏中的资产&#xff0c;避免被淘汰&#xff0c;现在有一家Bank&#xff0c;提供理财产品M个&#xff0c;风险及投资回报不同&#xff0c;你有N(元)进行投资&#xff0c;能接受的总风险值为X。你要在可接受范围…

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;更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

Django Auth的基本使用

auth 组件 导包 from django.contrib import auth 1. 登录 对比用户和秘密是否正确 user_obj auth.authenticate(request, usernameusername, passwordpassword) 保存用户信息 (存到 djang_session表中) auth.login(request, user_obj) 1.1 def login(request): …

泷羽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…

Web API - Clipboard

Clipboard API &#xff0c;它允许我们与用户的剪贴板进行交互&#xff0c;实现复制和粘贴的功能。 Clipboard API 提供了以下方法&#xff0c;用于实现复制和粘贴&#xff1a; navigator.clipboard.writeText(text)&#xff1a;这个方法用于将给定的文本复制到剪贴板。如果操…

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

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

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

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

单例模式的理解和实践

在软件开发中&#xff0c;设计模式是开发者在特定情境下&#xff0c;对常见问题的通用解决方案。这些模式帮助开发者以更高效、可维护的方式编写代码。其中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个…

zerotier实现内网穿透

zerotier的内网穿透 前言一、zerotier的框架认知二、客户端安装设置1.linux2.windows 前言 摸索了一阵&#xff0c;看了好几篇&#xff0c;没有讲清楚。争取这次说清楚。 一、zerotier的框架认知 先认识一下zerotier的框架&#xff0c;这样如何处理就很好理解了。 首先上zero…

windows11 使用体验记录

好的地方&#xff1a; UI上字体风格貌似更好看了&#xff0c;文件夹增加了多个标签&#xff0c;类似于浏览器既可以打开多个窗口&#xff0c;也可以在同一个窗口中打开多个标签页 不好的地方&#xff1a; 桌面右下角点击日期时间&#xff0c;显示日期&#xff0c;时间呢&…

牛客周赛 Round 70 A-E

本期封面原图 画师村カルキ 牛客周赛 Round 70 五题 A - 小苯晨跑 思路 没啥好说的 代码 // // Created by Swan416 on 2024-12-01 18:57. // #include <bits/stdc.h> #define maxOf(a) *max_element(a.begin(),a.end()) #define minOf(a) *min_element(a.begin(),a.…

C++20: 像Python一样split字符串

概要 Python 的字符串天生支持 split( ) 操作&#xff0c;支持单个字符或字符串作为分隔符。 C 在这方面显得很笨拙&#xff0c;但是在 C20 下经过一番尝试&#xff0c;还是能够提供类似的简洁调用。 Python 代码 s 0,11,336,23,370nums s.split(,) for n in nums:print(n…

oracle数据库日常操作

1、执行SQL语句后不显示PL/SQL procedure successfully completed set feedback off; 2、显示实例名称 echo "set sqlprompt \"_user_connect_identifier> \"" >> $ORACLE_HOME/sqlplus/admin/glogin.sql 3、客户端尝试连接到服务器时发生超时 …

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

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