python数据基础结构图_Python数据结构之图

该博客介绍了如何在C++和Python中使用邻接矩阵实现图数据结构,并提供了插入节点、删除节点、添加边、删除边等操作的实现。同时,博主展示了广度优先搜索(BFS)和深度优先搜索(DFS)的遍历算法。通过实例代码,展示了如何在给定的图中进行这两种遍历方法。
摘要由CSDN通过智能技术生成

关于图,在C++中我用的是近似邻接表结构,所以Python的图我用的是邻接矩阵法做为存储结构,0表示没有边,1表示有边。

#Data: 2013-9-18

#Author: DVD0423

#Function: 图

#邻接矩阵结构:

# map[][] = {

# -1,1,0,0,1,0,0,0

# 0,-1,0,0,0,0,0,0

# 0,0,-1,0,0,0,0,0

# 0,0,0,-1,0,0,0,0

# 0,0,0,0,-1,0,0,0

# 0,0,0,0,0,-1,0,0

# 0,0,0,0,0,0,-1,0

# 0,0,0,0,0,0,0,-1

# }

class Graph:

def __init__(self, maps = [], nodenum = 0, edgenum = 0):

self.map = maps #图的矩阵结构

self.nodenum = len(maps)

self.edgenum = edgenum

# self.nodenum = GetNodenum()#节点数

# self.edgenum = GetEdgenum()#边数

def isOutRange(self, x):

try :

if x >= self.nodenum or x <= 0:

raise IndexError

except IndexError:

print("节点下标出界")

def GetNodenum(self):

self.nodenum = len(self.map)

return self.nodenum

def GetEdgenum(self):

GetNodenum()

self.edgenum = 0

for i in range(self.nodenum):

for j in range(self.nodenum):

if self.map[i][j] is 1:

self.edgenum = self.edgenum + 1

return self.edgenum

def InsertNode(self):

for i in range(self.nodenum):

self.map[i].append(0)

self.nodenum = self.nodenum + 1

ls = [0] * self.nodenum

self.map.append(ls)

#假删除,只是归零而已

def DeleteNode(self, x):

for i in range(self.nodenum):

if self.map[i][x] is 1:

self.map[i][x] = 0

self.edgenum = self.edgenum -1

if self.map[x][i] is 1:

self.map[x][i] = 0

self.edgenum = self.edgenum - 1

def AddEdge(self, x, y):

if self.map[x][y] is 0:

self.map[x][y] = 1

self.edgenum = self.edgenum + 1

def RemoveEdge(self, x, y):

if self.map[x][y] is 0:

self.map[x][y] = 1

self.edgenum = self.edgenum + 1

def BreadthFirstSearch(self):

def BFS(self, i):

print(i)

visited[i] = 1

for k in range(self.nodenum):

if self.map[i][k] == 1 and visited[k] == 0:

BFS(self, k)

visited = [0] * self.nodenum

for i in range(self.nodenum):

if visited[i] is 0:

BFS(self, i)

def DepthFirstSearch(self):

def DFS(self, i, queue):

queue.append(i)

print(i)

visited[i] = 1

if len(queue) != 0:

w = queue.pop()

for k in range(self.nodenum):

if self.map[w][k] is 1 and visited[k] is 0:

DFS(self, k, queue)

visited = [0] * self.nodenum

queue = []

for i in range(self.nodenum):

if visited[i] is 0:

DFS(self, i, queue)

def DoTest():

maps = [

[-1, 1, 0, 0],

[0, -1, 0, 0],

[0, 0, -1, 1],

[1, 0, 0, -1]]

G = Graph(maps)

G.InsertNode()

G.AddEdge(1, 4)

print("广度优先遍历")

G.BreadthFirstSearch()

print("深度优先遍历")

G.DepthFirstSearch()

if __name__ == '__main__':

DoTest()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值