Python 邻接矩阵实现无向图、有向图的三种方法,并绘图显示

2023-10-26

网上查了很多资料,发现主要是使用邻接表来实现图,并进行遍历的。而采用邻接矩阵的就非常少。
不得已,就只有闭门造车,埋头苦修。小有成果,供后来学习者研究。

  1. 通过二维数组建立无向图
  2. 通过二维数组建立有向图
  3. 通过边建立有向图
  4. 为方便查看,通过NetworkX显示图。

不想看的可以直接下载:python 邻接矩阵三种方法实现有向图、无向图,并绘图显示

不废话。上代码

首先图类


class Graph_Matrix:
    """
    Adjacency Matrix
    """
    def __init__(self, vertices=[], matrix=[]):
        """

        :param vertices:a dict with vertex id and index of matrix , such as {vertex:index}
        :param matrix: a matrix
        """
        self.matrix = matrix
        self.edges_dict = {}  # {(tail, head):weight}
        self.edges_array = []  # (tail, head, weight)
        self.vertices = vertices
        self.num_edges = 0

        # if provide adjacency matrix then create the edges list
        if len(matrix) > 0:
            if len(vertices) != len(matrix):
                raise IndexError
            self.edges = self.getAllEdges()
            self.num_edges = len(self.edges)

        # if do not provide a adjacency matrix, but provide the vertices list, build a matrix with 0
        elif len(vertices) > 0:
            self.matrix = [[0 for col in range(len(vertices))] for row in range(len(vertices))]

        self.num_vertices = len(self.matrix)

    def isOutRange(self, x):
        try:
            if x >= self.num_vertices or x <= 0:
                raise IndexError
        except IndexError:
            print("节点下标出界")

    def isEmpty(self):
        if self.num_vertices == 0:
            self.num_vertices = len(self.matrix)
        return self.num_vertices == 0

    def add_vertex(self, key):
        if key not in self.vertices:
            self.vertices[key] = len(self.vertices) + 1

        # add a vertex mean add a row and a column
        # add a column for every row
        for i in range(self.getVerticesNumbers()):
            self.matrix[i].append(0)

        self.num_vertices += 1

        nRow = [0] * self.num_vertices
        self.matrix.append(nRow)

    def getVertex(self, key):
        pass

    def add_edges_from_list(self, edges_list):  # edges_list : [(tail, head, weight),()]
        for i in range(len(edges_list)):
            self.add_edge(edges_list[i][0], edges_list[i][1], edges_list[i][2], )

    def add_edge(self, tail, head, cost=0):
        # if self.vertices.index(tail) >= 0:
        #   self.addVertex(tail)
        if tail not in self.vertices:
            self.add_vertex(tail)
        # if self.vertices.index(head) >= 0:
        #   self.addVertex(head)
        if head not in self.vertices:
            self.add_vertex(head)

        # for directory matrix
        self.matrix[self.vertices.index(tail)][self.vertices.index(head)] = cost
        # for non-directory matrix
        # self.matrix[self.vertices.index(fromV)][self.vertices.index(toV)] = \
        #   self.matrix[self.vertices.index(toV)][self.vertices.index(fromV)] = cost

        self.edges_dict[(tail, head)] = cost
        self.edges_array.append((tail, head, cost))
        self.num_edges = len(self.edges_dict)

    def getEdges(self, V):
        pass

    def getVerticesNumbers(self):
        if self.num_vertices == 0:
            self.num_vertices = len(self.matrix)
        return self.num_vertices

    def getAllVertices(self):
        return self.vertices

    def getAllEdges(self):
        for i in range(len(self.matrix)):
            for j in range(len(self.matrix)):
                if 0 < self.matrix[i][j] < float('inf'):
                    self.edges_dict[self.vertices[i], self.vertices[j]] = self.matrix[i][j]
                    self.edges_array.append([self.vertices[i], self.vertices[j], self.matrix[i][j]])

        return self.edges_array

    def __repr__(self):
        return str(''.join(str(i) for i in self.matrix))

    def to_do_vertex(self, i):
        print('vertex: %s' % (self.vertices[i]))

    def to_do_edge(self, w, k):
        print('edge tail: %s, edge head: %s, weight: %s' % (self.vertices[w], self.vertices[k], str(self.matrix[w][k])))

第一种方法,二维数组生成图

def create_undirected_matrix(my_graph):
    nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

    matrix = [[0, 1, 1, 1, 1, 1, 0, 0],  # a
              [0, 0, 1, 0, 1, 0, 0, 0],  # b
              [0, 0, 0, 1, 0, 0, 0, 0],  # c
              [0, 0, 0, 0, 1, 0, 0, 0],  # d
              [0, 0, 0, 0, 0, 1, 0, 0],  # e
              [0, 0, 1, 0, 0, 0, 1, 1],  # f
              [0, 0, 0, 0, 0, 1, 0, 1],  # g
              [0, 0, 0, 0, 0, 1, 1, 0]]  # h

    my_graph = Graph_Matrix(nodes, matrix)
    print(my_graph)
    return my_graph

第二种方法,二维数组生成有向图

def create_directed_matrix(my_graph):
    nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    inf = float('inf')
    matrix = [[0, 2, 1, 3, 9, 4, inf, inf],  # a
              [inf, 0, 4, inf, 3, inf, inf, inf],  # b
              [inf, inf, 0, 8, inf, inf, inf, inf],  # c
              [inf, inf, inf, 0, 7, inf, inf, inf],  # d
              [inf, inf, inf, inf, 0, 5, inf, inf],  # e
              [inf, inf, 2, inf, inf, 0, 2, 2],  # f
              [inf, inf, inf, inf, inf, 1, 0, 6],  # g
              [inf, inf, inf, inf, inf, 9, 8, 0]]  # h

    my_graph = Graph_Matrix(nodes, matrix)
    print(my_graph)
    return my_graph

第三种方法,用边生成有向图

def create_directed_graph_from_edges(my_graph):
    nodes = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
    edge_list = [('A', 'F', 9), ('A', 'B', 10), ('A', 'G', 15), ('B', 'F', 2),
                 ('G', 'F', 3), ('G', 'E', 12), ('G', 'C', 10), ('C', 'E', 1),
                 ('E', 'D', 7)]

    my_graph = Graph_Matrix(nodes)
    my_graph.add_edges_from_list(edge_list)
    print(my_graph)
    return my_graph

最后显示图像代码
1.显示无向图

def draw_undircted_graph(my_graph):
    G = nx.Graph()  # 建立一个空的无向图G
    for node in my_graph.vertices:
        G.add_node(str(node))
    for edge in my_graph.edges:
        G.add_edge(str(edge[0]), str(edge[1]))

    print("nodes:", G.nodes())  # 输出全部的节点: [1, 2, 3]
    print("edges:", G.edges())  # 输出全部的边:[(2, 3)]
    print("number of edges:", G.number_of_edges())  # 输出边的数量:1
    nx.draw(G, with_labels=True)
    plt.savefig("undirected_graph.png")
    plt.show()

先建立无向图,再显示

无向图

2.显示有向图,带权


def draw_directed_graph(my_graph):
    G = nx.DiGraph()  # 建立一个空的无向图G
    for node in my_graph.vertices:
        G.add_node(str(node))
    G.add_weighted_edges_from(my_graph.edges_array)

    print("nodes:", G.nodes())  # 输出全部的节点
    print("edges:", G.edges())  # 输出全部的边
    print("number of edges:", G.number_of_edges())  # 输出边的数量
    nx.draw(G, with_labels=True)
    plt.savefig("directed_graph.png")
    plt.show()

这里写图片描述

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 邻接矩阵实现无向图、有向图的三种方法,并绘图显示 的相关文章

随机推荐

  • Description Resource Path Location Type Java compiler level does not match the version of the instal

    解决办法 在项目上右键Properties Project Facets 在打开的Project Facets页面中的Java下拉列表中 选择相应版本 有可能是java1 6 改成java6之类的
  • 【Python】平面多边形Wachspress坐标、中值坐标的计算及其等高线

    平面多边形Wachspress坐标 中值坐标的计算及其等高线 代码仅供参考 复杂度极高 暂时无优化 1 Wachspress坐标等高线绘制 1 1 程序 计算有向面积 def dir acr point1 point2 point3 res
  • Unity3d——ParticleSystem粒子光环

    记录一下学习的过程 首先是Inspector视窗中Particle System的属性 可以通过修改属性来改变粒子的效果 基本属性 Duration 发射器发送粒子持续的时间 比如设置为5 就是5秒后不再发送新的粒子 Looping 循环发
  • 1140: 小数点后第n位 多实例java

    import java util Scanner public class oj1 public static void main String args Scanner input new Scanner System in int t
  • 利用OpenGL设计贪吃蛇游戏

    利用OpenGL设计贪吃蛇游戏 文章目录 利用OpenGL设计贪吃蛇游戏 任务介绍 游戏玩法 开发环境 游戏实现 贪吃蛇游戏的框架搭建 主程序 游戏类 游戏对象类 工具类 着色器类 摄像机类 精灵渲染类 场景 蛇 食物的渲染 场景 蛇 食物
  • Windows 下将Python项目打包为.exe可执行文件

    Pycharm 打包为 exe 可执行文件 01 安装 PyInstaller 模块 02 打包文件 01 安装 PyInstaller 模块 Python 项目编写完成后 可以将其打包成一个 exe 可执行文件 这样即使计算机上没有Pyt
  • Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

    我们在做Android平台RTMP推送和GB28181设备对接的时候 遇到这样的问题 有的设备 麦克风采集出来的audio 音量过高或过低 特别是有些设备 采集到的麦克风声音过低 导致播放端听不清前端采集的audio 这时候 就需要针对采集
  • docker容器打通git

    现在github 是通过access token鉴权登录的 在个人设置页面可以创建自己的token 一定要记得保存下来 页面关闭后就不会再展示了 在docker容器中clone仓库代码 会报识别不出github域名 这个时候ping一下gi
  • Python类与对象

    目录 1 语法 1 1 定义类 1 2 调用类 1 3 方法 2 封装 2 1 属性 2 2 类与方法的相互调用 2 3 私有方法 3 继承 3 1 单继承 3 2 多继承 3 3 连续继承 3 4 调用父类同名方法 3 5 查看继承关系
  • Vue获取子组件实例对象 ref 属性

    在 Vue 中推荐使用 ref 属性获取 DOM 元素 这种方式可以提高性能 如果将 ref 属性使用在组件上 那么返回的就是这个组件的实例对象 使用方式 p 或 p
  • 纯css实现爱心

    实现原理图如下 代码如下
  • 计算公式python

    输入整数n 1 lt n lt 10000 计算公式1 1 1 2 1 1 2 n 的值 输入形式 从控制台输入整数n 1 lt n lt 10000 输出形式 控制台输出公式结果 小数点后保留4位 鲜例输入 4 样例输出 1 6000 样
  • python 使用pymysql连接Mysql方法

    调用如下方法传入sql 即可得到返回数据 链接 import pymysql from pymysql cursors import DictCursor def getData sql 1 连接数据库 conn pymysql conne
  • C++类模板 template

    类模板与函数模板的定义和使用类似 有时 有两个或多个类 其功能是相同的 仅仅是数据类型不同 如下面语句声明了一个类 class Compare int public Compare int a int b x a y b int max r
  • 7.24 两道二进制题目练习的总结

    1 兴趣是最好的老师 首先我们把根据PE文件的格式知道这个文件本身有错误 所以不能在IDA中打开 我们先把它在010Editor exe中修改一下 我们把PE头改为50 45 00 00 然后就把它拉入IDA中 然后打开 找到有程序的开始进
  • powershell共享服务器写文件,Powershell共享文件夹

    使用Powershell自动设置文件共享 需要用到WMI对象 WIN32 Share类 确保共享的文件夹是否存在 如果不存在就创建 创建一个WIN32 Share对象 查看WIN32 Share对象支持的方法 查看WIN32 Share的c
  • DVWA-XSS (Stored) Low/Medium/High低中高级别

    作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 对网络安全感兴趣的小伙伴可以关注专栏 网络安全入门到精通 XSS Stroed 一 Low级别 二 Medium级别 三 Hign级别 这关是
  • 七、VPN技术之隧道技术原理与VPN技术原理(PPTP协议、L2TP协议、MPLS VPN、Web VPN)

    更多网络基础内容可见 网络基础学习目录及各章节指引 7 2 GRE 虽然计算机网络技术已经逐步发展完善和成熟 并且具有通用的OSI模型体系和TCP IP模型体系 但是各类厂商公司在研发自己的网络设备时 依旧会有自己私有协议的存在 当我们在发
  • Python3.7 Scrapy 执行爬虫任务提示:Unknown command: crawl

    Windows cmd 窗口执行爬虫任务指令 提示如下错误信息 错误的原因 误删了Scrapy 项目下的scrapy cfg的文件 导致上面错误情况的发生
  • Python 邻接矩阵实现无向图、有向图的三种方法,并绘图显示

    网上查了很多资料 发现主要是使用邻接表来实现图 并进行遍历的 而采用邻接矩阵的就非常少 不得已 就只有闭门造车 埋头苦修 小有成果 供后来学习者研究 通过二维数组建立无向图 通过二维数组建立有向图 通过边建立有向图 为方便查看 通过Netw