Educoder_头歌实训_离散数学_图论

这篇具有很好参考价值的文章主要介绍了Educoder_头歌实训_离散数学_图论。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

第1关:图的概念

任务描述

相关知识

图的概念

习题参考

第2关:图的表示

任务描述

相关知识

图的表示

编程要求

测试说明

习题参考

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

任务描述

相关知识

单源最短通路

Dijkstra算法

编程要求

测试说明

习题参考


第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​ 我们可以画出这个图:

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

2.设G是一个简单图,如果G的任意两个顶点都邻接,则称G完全图p个顶点的完全图记为kp​,称为p阶完全图。

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

3.顶点的度:设G是一个图,v∈V(G),G中与v关联的边的数目称为vG中的度数,简称为v的度。一个图的所有顶点的度之和是边数的两倍。

4.各顶点度的最大值和最小值分别被称为最大度最小度,若一个图的最大度和最小度相等,则称G为一个正则图,其度为k,则称G为一个“k-正则图”。p阶完全图一定是一个“(p-1)-正则图”,反之不然。

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

5.图的同构:只要图中的所有点与其连接的边不变,不管图的形状和位置如何变化,都代表同一图。

6.设G是一个图,G中一个顶点和边的非空有限序列w=v0​e1​v1​e2​v2​...en​vn​,称为G的一个途径。其中vi​∈V(G),ej​∈E(G),i=0,1,...,n,其中v0​vn​分别称为途径的起点和终点。

7.途径中边和点可以重复出现,若途径中的边互不相同,则称为链。一条链中的,边不重复,但顶点是可以重复出现的。如果途径中的顶点互不相同,则称为通路

8.起点和终点相同的途径称为闭途径,起点和终点相同的链称为闭链,起点和终点相同的通路称为回路,边的长度为 k 的回路称为 k-回路。

9.若图中的两个顶点都是连通的,则称为连通图,否则称为非连通图。

习题参考

1、5阶无向完全图的边数为:

A、5 

B、10

C、15

D、20

2、设图Gn个结点,m条边,且G中每个结点的度数不是k,就是k+1,则G中度数为k的节点数是:

A、n(k+1)-2m

B、nk-2m

C、n(n+1)

D、n/2

3、若一个图有5个顶点,8条边,则该图所有顶点的度数和为多少?

A、13

B、10

C、15

D、16


第2关:图的表示

任务描述

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

相关知识

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

图的表示

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

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

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

我们用关联矩阵表示为:

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

用邻接矩阵表示为:

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,使用两种矩阵分别表示下面两个图:

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

测试说明

平台会对你编写的代码进行测试,只有所有输出都正确才能通过。

习题参考

#coding=utf-8

import 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,令

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

W(H)H的权。例如,下图为一带权通路图。

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

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

# 构建带权图邻接表
# 将图各点的连接情况用数组表示
data = [
    [0, 2, 20],
    [0, 1, 10],
    [1, 3, 30]
    [2, 3, 5],
    [2, 1, 25],
]
graph = [[] for _ in range(4)]
n = len(graph)
for edge in data:
    graph[edge[0]].append([edge[1], edge[2]])
    graph[edge[1]].append([edge[0], edge[2]])
print(graph)

输出:

[[[2, 20], [1, 10]],     (点0 的连接情况)
[[0, 10], [3, 30], [2, 25]],     (点1 的连接情况)
[[0, 20], [3, 5], [1, 25]],   (点2 的连接情况)
[[1, 30], [2, 5]]]            (点3 的连接情况)

Dijkstra算法

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

  1. S:已求出的顶点的集合(初始时只含有源);
  2. V-S=T:尚未确定的顶点集合。

T中顶点按递增的次序加入到S中,保证:

  1. 从源点到S中其他各顶点的长度都不大于从源到T中任何顶点的最短路径长度;
  2. 每个顶点对应一个距离值。

S中顶点:从源到此顶点的长度; T中顶点:从源到此顶点的只包括S中顶点作中间顶点的最短路径长度。

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

算法步骤:

S:={1};
for i:=2 to n do
D[i]:=C[1,j];  {初始化D}
for i:=1 to n-1 do begin
从V-S中选取一个顶点w使得D[w]最小;
将w加入到S中;
对每个顶点`$$v\in V-S$$`执行;
D[v]:=min{D[v],  D[w]+c[w,v]}

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,使用 Dijkstra 算法计算下图中从点某点出发到各个点的花销以及每个点最短通路的各点前一节点列表。

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

测试说明

平台会对你编写的代码进行测试:

测试输入:一个起点值,0-6

预期输出:

第一行输出起点到各个点的花费;

第二行输出到每个点最短通路中的点前一节点。

[0, 6, 1, 7, 9, 4, 2]

[-1, 2, 0, 6, 5, 0, 0]

测试输入:0

预期输出:

[0, 6, 1, 7, 9, 4, 2]

[-1, 2, 0, 6, 5, 0, 0]

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

Educoder_头歌实训_离散数学_图论,离散数学,头歌,图论,算法,python

两个列表要注意的是:文章来源地址https://www.toymoban.com/news/detail-768356.html

  1. 0-0没有前一点,用-1表示,花费为0
  2. 0-33的最小花费前一点为66的最小花费前一点为0

习题参考

#coding=utf-8
 
import 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 = 99999
    minNode = 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和parents
    for 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 *****#

到了这里,关于Educoder_头歌实训_离散数学_图论的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Educoder离散数学实训】关系基础

    题有点多,能聊的不多。有些题还是比较有价值的 就单独说几个题,代码放在最后。所有函数都改成自己写的了,没准比答案给的好读一点? T1 求给定集合的对角线关系(diagonal relation) 我觉得如果卡住的话,第一关会是一个大坎。 因为我们并不知道他到底在说啥,于是我

    2024年02月07日
    浏览(52)
  • 湖南大学python头歌实训 实验2:分支语句(一)

    第二章-Python语言基础-2.1简单计算问题的求解(理科) 第1关:数据输入与输出 编程要求 根据提示,在右侧编辑器补充代码,完成如下程序的编写。 第一题 在屏幕上输出字符串:hi, \\\"how are you\\\" ,I\\\'m fine and you 第二题 从键盘输入两个整数,计算两个数相除的商与余数 假设输入

    2024年04月13日
    浏览(45)
  • 头歌实训Junit实训进阶篇

    学员写一个Junit异常测试,用来判断实例化的对象数据是否合法。

    2024年02月16日
    浏览(50)
  • 头歌实训-机器学习(逻辑回归)

    1.逻辑回归简述 2.逻辑回归算法详解 3.sklearn逻辑回归 - 手写数字识别 4.逻辑回归案例 - 癌细胞精准识别

    2024年04月13日
    浏览(42)
  • 【头歌实训】kafka-入门篇

    本关任务:使用 Kafka 命令创建一个副本数量为 1 、分区数量为 3 的 Topic 。 为了完成本关任务,你需要掌握:1.如何使用 Kafka 的常用命令。 课程视频《Kafka简介》 Kafka 简述 类 JMS 消息队列,结合 JMS 中的两种模式,可以有多个消费者主动拉取数据,在 JMS 中只有点对点模式才

    2024年02月03日
    浏览(48)
  • 【头歌实训】PySpark Streaming 入门

    本关任务:使用 Spark Streaming 实现词频统计。 为了完成本关任务,你需要掌握: Spark Streaming 简介; Python 与 Spark Streaming; Python Spark Streaming API; Spark Streaming 初体验(套接字流)。 Spark Streaming 简介 Spark Streaming 是 Spark 的核心组件之一,为 Spark 提供了可拓展、高吞吐、容错的

    2024年02月04日
    浏览(43)
  • 头歌实训平台C语言

    目录 C语言程序设计编辑与调试环境  第1关打印输出 Hello World   第2关打印输出图形  第3关求3个数的最大值  第4关熟悉C语言调试过程 顺序结构程序设计 第1关加法运算 第2关不使用第3个变量,实现两个数的对调 第3关用宏定义常量 第4关数字分离 第5关计算总成绩和平均成绩

    2023年04月25日
    浏览(62)
  • 【头歌实训】分布式文件系统 HDFS

    本关任务:使用 Hadoop 命令来操作分布式文件系统。 为了完成本关任务你需要了解的知识有:1. HDFS 的设计,2. HDFS 常用命令。 HDFS的设计 分布式文件系统 客户:帮我保存一下这几天的数据。 程序猿:好嘞,有多大呢? 客户: 1T 。 程序猿:好没问题,买个硬盘就搞定了。

    2024年04月15日
    浏览(65)
  • 数据库原理 头歌实训 数据库常用对象

    任务描述 本关任务:创建计算机系的学生信息的视图 student_cs。 相关知识 行列子集视图是指视图的结果集来源于基本表,没有经过二次计算。 #####创建视图 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTIO

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包