• 图数据结构之邻接矩阵Adjacency Matrix(Python版)


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

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

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

    具体代码如下:

    1. class MatrixGraph():
    2. '''
    3. 初始化一个顶点数组与点边二维数组
    4. n:顶点个数
    5. '''
    6. def __init__(self, n):
    7. self.vertexes = []
    8. self.graph = [[0]*n for j in range(0, n)]
    9. def addVertex(self, n):
    10. '''
    11. 添加顶点
    12. return:所有顶点的列表
    13. '''
    14. vertexList = self.vertexes
    15. for i in range(0, n):
    16. vertex = input("请输入顶点值:").strip()
    17. if vertex != None and vertex != '#':
    18. vertexList.append(vertex)
    19. return vertexList
    20. def adjacencyMatrix(self, vertexList):
    21. '''
    22. 邻接矩阵,邻边使用1表示
    23. '''
    24. while True:
    25. start = input("请输入起点:").strip()
    26. end = input("请输入相邻节点:").strip()
    27. if start == '#' and end == '#':
    28. break
    29. if start == end and (start != '#' and end != '#'):
    30. print("相邻节点不能是自己")
    31. continue
    32. if (start not in vertexList) or (end not in vertexList):
    33. print("图中没有此节点,请重新输入")
    34. continue
    35. else:
    36. i = vertexList.index(start)
    37. j = vertexList.index(end)
    38. self.graph[i][j] = 1
    39. self.graph[j][i] = 1
    40. return self.graph
    41. def printGraph(self, n):
    42. graph = self.graph
    43. for i in range(0, n):
    44. print(graph[i], end="\n")
    45. if __name__ == '__main__':
    46. n = int(input("请输入顶点个数:").strip())
    47. matrixGraph = MatrixGraph(n)
    48. vertextList = matrixGraph.addVertex(n)
    49. print("图中所有顶点:", vertextList)
    50. matrixGraph.adjacencyMatrix(vertextList)
    51. matrixGraph.printGraph(n)
    1. '''
    2. 请输入顶点个数:5
    3. 请输入顶点值:A
    4. 请输入顶点值:B
    5. 请输入顶点值:C
    6. 请输入顶点值:D
    7. 请输入顶点值:E
    8. 图中所有顶点: ['A', 'B', 'C', 'D', 'E']
    9. 请输入起点:A
    10. 请输入相邻节点:B
    11. 请输入起点:A
    12. 请输入相邻节点:C
    13. 请输入起点:A
    14. 请输入相邻节点:D
    15. 请输入起点:A
    16. 请输入相邻节点:E
    17. 请输入起点:C
    18. 请输入相邻节点:D
    19. 请输入起点:#
    20. 请输入相邻节点:#
    21. [0, 1, 1, 1, 1]
    22. [1, 0, 0, 0, 0]
    23. [1, 0, 0, 1, 0]
    24. [1, 0, 1, 0, 0]
    25. [1, 0, 0, 0, 0]
    26. '''

    比如这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即可,这种叫做加权相邻边的矩阵,挺简单的。

  • 相关阅读:
    Mybatis深入:数据源实现原理
    Debian11 安装 OpenJDK8
    Spring Cloud Gateway 搭建网关
    Linux工具——gcc
    AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
    【软件测试】性能测试初相识
    GhMYB7促进棉纤维中次生壁纤维素的积累
    DirectX 12 学习笔记 -结构
    linux安全配置规范
    AsynchronousFileChannel写数据
  • 原文地址:https://blog.csdn.net/weixin_41896770/article/details/128128667