图的邻接表实现(Python)

在实现稀疏图的时候,邻接矩阵会使用大量空间用来表示两个顶点没有邻接关系,但是实际使用时我们更关注有邻接关系的顶点,所以为了避免这个问题,可以使用邻接表来实现图,也就是使用链表来表示顶点间的连接关系

"""
图的邻接表实现
"""
import numpy as np


class ArcNode:
    """ 弧结点 """
    def __init__(self, adj_vex, next_arc, info):
        self.adj_vex = adj_vex
        self.next_arc = next_arc
        self.info = info


class VNode:
    """ 顶点 """
    def __init__(self, data):
        self.data = data
        self.first_arc = None


class ALGraph:
    """ 邻接表-图 """
    def __init__(self):
        self.vertices = np.array([], dtype=VNode)
        self.vex_num = 0
        self.arc_num = 0

    def create_udg(self):
        """ create undirected graph"""

    def locate_vex(self, vertex):
        for i in range(self.vex_num):
            if self.vertices[i].data == vertex:
                return i
        return -1

    def create_dg(self, vex_data: list, head_vex: list, tail_vex: list, weight: list):
        """
            create directed graph(构建有向图)
            时间复杂度: O( max{n, e} ), n表示顶点数量,e表示弧数量

            vex_data: 所有顶点的ID
            head_vex: 所有弧头的ID
            tail_vex: 所有弧尾的ID
            weight: 所有弧的权值
        """
        self.vex_num = len(vex_data)
        self.arc_num = len(head_vex)
        for i in range(self.vex_num):
            self.vertices = np.append(self.vertices, [VNode(vex_data[i])])
        for i in range(self.arc_num):
            tail_vex_index = self.locate_vex(tail_vex[i])
            head_vex_index = self.locate_vex(head_vex[i])
            first_arc = self.vertices[tail_vex_index].first_arc
            arc_node = ArcNode(adj_vex=head_vex_index, next_arc=first_arc, info=weight[i])
            self.vertices[tail_vex_index].first_arc = arc_node

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值