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