第1关:图的概念
-
5阶无向完全图的边数为:10
-
设图
G
有n
个结点,m
条边,且G
中每个结点的度数不是k
,就是k+1
,则G
中度数为k
的节点数是:n(k+1)-2m
-
若一个图有5个顶点,8条边,则该图所有顶点的度数和为多少?16
第2关:图的表示
他让输出关联矩阵和邻接矩阵这不简单么?
#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关:单源最短通路问题
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,使用 Dijkstra 算法计算下图中从点某点出发到各个点的花销以及每个点最短通路的各点前一节点列表。
####测试说明
平台会对你编写的代码进行测试: 测试输入:一个起点值,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]
两个列表要注意的是:文章来源:https://www.toymoban.com/news/detail-767127.html
-
0-0
没有前一点,用-1
表示,花费为0
。 -
0-3
,3
的最小花费前一点为6
,6
的最小花费前一点为0
。
语言很无力直接上代码吧!有真的说 图论时真的恶心!文章来源地址https://www.toymoban.com/news/detail-767127.html
#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 *****#
到了这里,关于头歌实训-离散数学-图论!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!