python实现图数据结构_数据结构之图的代码实现(使用Python实现)

图的数据结构Python代码实现

使用邻接列表实现.

代码数据结构图示

20200327215239902148.png

数据结构文字描述

Graph().self.vertList : {

key:Vertext(){

self.id = key

self.connectedTo{

相邻节点类实例 : 权重

..

..

}

},

key2:Vertext(){

self.id = key

self.connectedTo{

相邻节点类实例 : 权重

..

..

}

}

..

}

代码实现

class Vertext(): # 包含了顶点信息,以及顶点连接边

def __init__(self,key):#key表示是添加的顶点

self.id = key

self.connectedTo = {} # 初始化临接列表

def addNeighbor(self,nbr,weight=0):# 这个是赋值权重的函数

self.connectedTo[nbr] = weight

def __str__(self):

return str(self.id)+ ‘ connectedTo: ‘+str([x.id for x in self.connectedTo])

def getConnections(self): #得到这个顶点所连接的其他的所有的顶点 (keys类型是class)

return self.connectedTo.keys()

def getId(self): # 返回自己的key

return self.id

def getWeight(self,nbr):#返回所连接ner顶点的权重是多少

return self.connectedTo[nbr]

‘‘‘

Graph包含了所有的顶点

包含了一个主表(临接列表)

‘‘‘

class Graph():# 图 => 由顶点所构成的图

‘‘‘

存储图的方式是用邻接表实现的.

数据结构: {

key:Vertext(){

self.id = key

self.connectedTo{

相邻节点类实例 : 权重

..

..

}

}

..

..

}

‘‘‘

def __init__(self):

self.vertList = {} # 临接列表

self.numVertices = 0 # 顶点个数初始化

def addVertex(self,key):# 添加顶点

self.numVertices = self.numVertices + 1 # 顶点个数累加

newVertex = Vertext(key) # 创建一个顶点的临接矩阵

self.vertList[key] = newVertex

return newVertex

def getVertex(self,n):# 通过key查找定点

if n in self.vertList:

return self.vertList[n]

else:

return None

def __contains__(self,n):# transition:包含 => 返回所查询顶点是否存在于图中

#print( 6 in g)

return n in self.vertList

def addEdge(self,f,t,cost=0): # 添加一条边.

if f not in self.vertList: # 如果没有边,就创建一条边

nv = self.addVertex(f)

if t not in self.vertList:# 如果没有边,就创建一条边

nv = self.addVertex(t)

if cost == 0:# cost == 0 代表是没有传入参数,而使用的默认参数0,即是是无向图

self.vertList[f].addNeighbor(self.vertList[t],cost) # cost是权重.无向图为0

self.vertList[t].addNeighbor(self.vertList[f],cost)

else:#

self.vertList[f].addNeighbor(self.vertList[t],cost) # cost是权重

def getVertices(self):# 返回图中所有的定点

return self.vertList.keys()

def __iter__(self): #return => 把顶点一个一个的迭代取出.

return iter(self.vertList.values())

#

# -------------------------------------------------

# 以下是测试数据.可删除

# -------------------------------------------------

#

g = Graph()

# for i in range(6):

# g.addVertex(i)

# print(g.vertList)

‘‘‘

# a = g.vertList[0]

# print(a.connectedTo)

‘‘‘

g.addEdge(0,5,2)

g.addEdge(1,2,4)

g.addEdge(2,3,9)

g.addEdge(3,4,7)

g.addEdge(3,5,3)

g.addEdge(4,0,1)

g.addEdge(5,4,8)

g.addEdge(5,2,1)

print(g.getVertices())

# vertList = { key :VertextObject}

# VertextObject = ||key = key, connectedTo = {到达节点:权重}|| => |||| 表示的是权重的意思

# print(g)

for v in g: # 循环类实例 => return -> g = VertextObject的集合 v = VertextObject

for w in v.getConnections(): # 获得类实例的connectedTO

# print(w)

print("({},{}:{})".format(v.getId(),w.getId(),v.getWeight(w))) ## 为什么会是这样 => 因为这个时候v就是class啊

参考

原文地址:https://www.cnblogs.com/gtscool/p/12584117.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值