图数据结构之邻接矩阵Adjacency Matrix(Python版)
创始人
2024-03-06 05:21:42
0

        对于图这样的数据结构,我们在 图数据结构之字典实现(Python版) 有一种示例,可以表示出从起点出发有多少条路径选择,然后到达某个指定的终点,下面来看下另外一种图的数据结构。

邻接矩阵:顾名思义就是一个二维数组(矩阵)来保存顶点与相邻顶点之间的关系,这个关系可以看做是带权值的边。一个一维数组保存顶点数据,一个二维数组保存边的权值,这样的二维数组就是邻接矩阵。

这里就简单介绍一个无向的用1来代替之间相邻的示例,权值可以简单看成A点到邻接B点的距离,这里就全部看做相等,1来表示,不相邻就使用0来表示。

具体代码如下:

class MatrixGraph():'''初始化一个顶点数组与点边二维数组n:顶点个数'''def __init__(self, n):self.vertexes = []self.graph = [[0]*n for j in range(0, n)]def addVertex(self, n):'''添加顶点return:所有顶点的列表'''vertexList = self.vertexesfor i in range(0, n):vertex = input("请输入顶点值:").strip()if vertex != None and vertex != '#':vertexList.append(vertex)return vertexListdef adjacencyMatrix(self, vertexList):'''邻接矩阵,邻边使用1表示'''while True:start = input("请输入起点:").strip()end = input("请输入相邻节点:").strip()if start == '#' and end == '#':breakif start == end and (start != '#' and end != '#'):print("相邻节点不能是自己")continueif (start not in vertexList) or (end not in vertexList):print("图中没有此节点,请重新输入")continueelse:i = vertexList.index(start)j = vertexList.index(end)self.graph[i][j] = 1self.graph[j][i] = 1return self.graphdef printGraph(self, n):graph = self.graphfor i in range(0, n):print(graph[i], end="\n")if __name__ == '__main__':n = int(input("请输入顶点个数:").strip())matrixGraph = MatrixGraph(n)vertextList = matrixGraph.addVertex(n)print("图中所有顶点:", vertextList)matrixGraph.adjacencyMatrix(vertextList)matrixGraph.printGraph(n)
'''
请输入顶点个数:5
请输入顶点值:A
请输入顶点值:B
请输入顶点值:C
请输入顶点值:D
请输入顶点值:E
图中所有顶点: ['A', 'B', 'C', 'D', 'E']
请输入起点:A
请输入相邻节点:B
请输入起点:A
请输入相邻节点:C
请输入起点:A
请输入相邻节点:D
请输入起点:A
请输入相邻节点:E
请输入起点:C
请输入相邻节点:D
请输入起点:#
请输入相邻节点:#
[0, 1, 1, 1, 1]
[1, 0, 0, 0, 0]
[1, 0, 0, 1, 0]
[1, 0, 1, 0, 0]
[1, 0, 0, 0, 0]
'''

比如这5个顶点与相邻边组成的一张图(邻接矩阵),最后的二维数组我们来看下:

[0, 1, 1, 1, 1]
[1, 0, 0, 0, 0]
[1, 0, 0, 1, 0]
[1, 0, 1, 0, 0]
[1, 0, 0, 0, 0]

我们可以看到主对角线(左上角到右下角)中间都是0,其余是一种对称结构。初学者可能对这个矩阵不是很了解,怎么看出相邻边,我这里解释下。

A点相邻的有B,C,D,E四个节点,所以第一行的索引位置1234都为1
B点的相邻节点,只有A这个节点是吧,所以就是索引0位置为1
C节点,相邻节点有A和D两个节点,所以在索引0和3的位置为1
D节点的相邻节点是A和C,所以在索引0和2的位置为1
E节点只有A相邻,所以就是索引在0位置的值为1

这里的1就是权值,如果想要表示A点到B点的权值为2,A到C点的权值为3,那么这里就分别赋值为2和3即可,这种叫做加权相邻边的矩阵,挺简单的。

相关内容

热门资讯

帮忙怎么写句子? 帮忙怎么写句子?着急着急着急啥五金。mQ…用"帮忙"造句:1、对他的帮助,我向他致谢。2、她贬低我...
魔法禁书目录里御坂美琴和当麻扮... 魔法禁书目录里御坂美琴和当麻扮情侣是那集魔法禁书目录第二季第17话 惩罚游戏是魔法禁书目录第二季第1...
树根怎么画 树根怎么画树根没什么捷径,多看图、多临摹,仔细花。请设为满意答案吧
摩托车保险网上怎么买 务必找正...   现在人们除了会为自己配置一辆车以外,有的年轻人还会添购一辆酷酷的摩特车,或者一些生活在不那么发达...
北京七类人不用隔离14天,北京...   20年的开始全国上下就经历了一场非常大的浩劫---新冠肺炎,它威胁了去全国上下所有人的生命,也组...
个人信用贷款一般可以贷多少?信...   现在贷款方式有很多种,最简单的当然还是个人信用贷款,毕竟不是所有平台都可以没有抵押物能贷款,个人...
百万医疗保险一年要交多少保费?...   当今最热门的保险,非百万医疗险莫属,百万医疗险的性价比高,有很高的保额,报销的范围也是非常广的,...
重疾险和医疗险的区别,重疾险和...   医疗条件水平的提高使得大家的寿命不断的延长,人们的生活水平也随之提高。国家也不断的重视医疗水平的...
学龄前儿童过马路交通事故 学龄前儿童过马路交通事故甲方(证照齐全)驾驶小客车国道正常行驶,车速在规定范围内;乙方(4、5岁小孩...
可以带病投保的百万医疗险有吗?...   百万医疗险其实简单的来说就是一款保额高达百万的医疗险。这款保险可以给你报销除了医保报销的剩下一些...