图数据结构之邻接矩阵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即可,这种叫做加权相邻边的矩阵,挺简单的。

相关内容

热门资讯

富士莱一季度营收1.13亿元同... 4月21日,富士莱发布2025年一季报。报告显示,公司一季度营业收入为1.13亿元,同比增长17.4...
中国建筑2024年实现营业收入... 本报讯 (记者向炎涛)日前,中国建筑股份有限公司(以下简称“中国建筑”)发布2024年年度报告。20...
预计俄罗斯央行将维持关键利率在...   路透社周一进行的一项调查显示,参与调查的 25 位分析师均预计,俄罗斯央行在 4 月 25 日的...
“考公上岸秘籍”大公开,手慢无... 转自:法治日报在大众的认知里警犬大多是威风凛凛的德国牧羊犬、拉布拉多犬或是敏捷聪慧的马犬可你能想象平...
一举两得一元一分跑得快微信群哔... 微【mz120590】 【mj120590】【mj191717】等风也等你。喜欢打麻将的兄弟姐妹们、...
《围观》一元一分正规红中麻将微... 认准管理加v:微【mz120590】【mj120590】【mj191717】七年稳定老群!随时拿起手...
【生活常识】正规红中麻将跑的快... 认证群主微信微【mz120590】 【mj120590】【mj191717】(一元俩元红中麻将)(跑...
必看经典15张跑的快群@24小... 1.进群方式-[mz120590]或者《mj120590》【mj191717】--QQ(QQ5672...
全网普及一元一分正规红中麻将微... 认准管理加v:微【mz120590】【mj120590】【mj191717】七年稳定老群!随时拿起手...
《关注麻将》一元一分正规红中麻... 微信一元麻将群群主微【mz120590】 【mj191717】【mj120590】一元一分群内结算,...
百诚医药:已获得1个1类创新药... 每经AI快讯,有投资者在投资者互动平台提问:请问贵公司会搬离杭州吗?为何杭州的创新精神在贵公司一点都...
奥海科技(002993.SZ)... 格隆汇4月21日丨奥海科技(002993.SZ)公布2025年一季度报告,一季度公司实现营业收入14...
狐假虎威谁有广东红中一元一分麻... 一元一分麻将群加群主微【mz120590】【mj191717】 【mj120590】等风也等你。喜欢...
LPR报价连续6个月未变,有何... 每经记者 张寿林    每经编辑 廖丹     中国人民银行授权全国银行间同业拆借...
国盛金控2024年实现净利润1... 上证报中国证券网讯(记者李雨琪)4月21日晚间,国盛金控披露2024年年度报告。报告期内,公司实现营...
天亿马高管平均年薪28.30万... 4月21日,天亿马最新高管薪酬曝光。根据2023年报数据,剔除独立董事、监事会主席、监事后,天亿马共...
全网普及红中麻将跑得快群@20... 微信一元麻将群群主微【mz120590】 【mj191717】【mj120590】一元一分群内结算,...
正式停运!已陪伴昆明人32年,... 4月21日,随着龙门景区周边的围挡立起,运行32年的西山龙门索道正式停运并开始进行原址提升改造。都市...
金丹科技去年归母净利下降56%... 每经记者 王佳飞    每经编辑 文多     2025年4月20日,金丹科技(S...
探寻昌平延寿镇,感受民宿里的慢... 京都母亲河绵延流淌,孕育出昌平延寿镇的灵秀之美。这里不仅有大杨山自然风景区、延寿寺和银山塔林等著名景...