title: 图的存储结构实现:邻接表
date: 2019-09-02 19:49:22
tags: python,数据结构
categories: 计算机理论
邻接表实现
数据格式如图所示:
graph = {
"A": {
"B": 5, "C": 1},
"B": {
"A": 5, "C": 2, "D": 1},
"C": {
"A": 1, "B": 2, "D": 4, "E": 8},
"D": {
"B": 1, "C": 4, "E": 3, "F": 6},
"E": {
"C": 8, "D": 3},
"F": {
"D": 6},
}
如上图所示,该类是一个无向网,如果需要改成有向网,只需要更改add_edge
这个方法
新建一个GraphAL.py
文件,在文件中添加:
# 邻接表实现无向网(图)(字典形式)
class GraphAL:
def __init__(self, graph={
}):
self._graph = graph
self._vnum = len(graph)
def _invalid(self, vertex):
return self._graph.__contains__(vertex)
def add_vertex(self, vertex):
if self._invalid(vertex):
raise GraphError("添加顶点失败,已经有该顶点")
self._graph[vertex] = {
}
self._vnum += 1
def add_edge(self, vi, vj, val):
if not self._invalid(vi) or not self._invalid(vj):
raise GraphError("不存在" + vi + "或者" + vj + "这样的顶点")
self._graph[vi].update({
vj: val})
self._graph[vj].update({
vi: val})
def get_edge(self, vi, vj):
if not self._invalid(vi) or not self._invalid(vj):
raise GraphError("不存在" + vi + "或者" + vj + "这样的顶点")
return self._graph[vi][vj]
def get_vertexNum(self):
return self._graph.__len__()
# 在无向网(图)中是边,有向网(图)是出边,取决于数据
def out_edge(self, vertex):
if not self._invalid(vertex):
raise GraphError("不存在" + vertex + "这样的顶点")
return self._graph[vertex]
你也可以不传入图的参数,会默认创建一个新图。通过add_vertex
和add_edge
即可完成图的构建。