13_python_graph

文章目录图的概念ADT Graph的实现图搜索算法广度优先搜索BFS深度优先搜索DFS骑士周游专用算法通用DFS图的应用词梯问题骑士周游问题初始算法Warnsdorff算法拓扑排序强连通分支最短路径问题最小生成树图的概念图可以用G=(V,E)来表述,对于图G,V是顶点的集合,E是边的集合。每个边是一个元组(v,w),v和w属于顶点集合V。路径:由边依次连接起来的顶点序列。将路径定义为P=(...
摘要由CSDN通过智能技术生成

图的概念

图可以用G=(V,E)来表述,对于图G,V是顶点的集合,E是边的集合。每个边是一个元组(v,w),v和w属于顶点集合V。

  • 路径:由边依次连接起来的顶点序列。将路径定义为P=(w1,w2,…,wn) ,其中1<=i<=n-1.无权路径的长度为边的数量,带权路径的长度为所有边的权重之和。
  • 圈:有向图里的圈是首尾顶点相同的路径

ADT Graph的实现

顶点Vertex类:包含了顶点信息,以及顶点连接边的信息

  • 每一个Vertex使用一个字典来记录顶点与顶点之间的连接关系和每条连接边的权重,这个字典被称作connectionedTo
class Vertex:
    def __init__(self, key):
        self.id = key
        self.connectedTo = {
   }
    
    def addNeighbor(self, nbr, weight = 0): #该方法被用来添加从一个顶点到另一个顶点的连接
        self.connectedTo[nbr] = weight  #nbr是顶点对象的key
    
    def __str__(self):
        return str(self.id) + 'connectedTo: ' + str([x.id for x in self.connectedTo])
    
    def getConnections(self):  #该方法被用来返回以connectionTo字典中的实例变量所表示的邻接表中的所有顶点
        return self.connectedTo.keys()
    
    def getId(self):
        return self.id
    
    def getWeight(self, nbr):  #该方法通过一个参数返回顶点与顶点之间的边的权重
        return self.connectedTo[nbr]

图Graph类:保存了包含所有顶点的主表

  • 包含了一个将顶点名称映射到顶点对象的字典,即vertList
class Graph:
    def __init__(self):
        self.vertList = {
   }
        self.numVertices = 0
    
    def addVertex(self, key):
        self.numVertices = self.numVertices + 1
        newVertex = Vertex(key)  #新加顶点
        self.vertList[key] = newVertex
        return newVertex
    
    def getVertex(self, n):
        if n in self.vertList:
            return self.vertList[n]  #通过key查找顶点
        else:
            return None
    
    def __contains__(self, n):
        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.addVertex:
            nv = self.addVertex(t)
        self.vertList[f].addNeighbor(self.vertList[t], cost)  #调用起始顶点的方法添加邻接边
    
    def getVertices(self):  #返回图中所有顶点的名称
        return self.vertList.keys()
    
    def __iter__(self):
        return iter(self.vertList.values())

ADT Grapgh实现代码测试:

class Vertex:
    def __init__(self,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):
        return self.connectedTo.keys()

    def getId(self):
        return self.id

    def getWeight(self,nbr):
        return self.connectedTo[nbr]
        
        
class Graph:
    def __init__(self):
        self.vertList = {
   }
        self.numVertices = 0

    def addVertex(self,key):
        self.numVertices = self.numVertices + 1
        newVertex = Vertex(key)
        self.vertList[key] = newVertex
        return newVertex

    def getVertex(self,n):
        if n in self.vertList:
            return self.vertList[n]
        else:
            return None

    def __contains__(self,n):
        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)
        self.vertList[f].addNeighbor(self.vertList[t], cost)

    def getVertices(self):
        return self.vertList.keys()

    def __iter__(self):
        return iter(self.vertList.values())
        
        
        
g = Graph()
for i in range(6):
    g.addVertex(i)
print(g.vertList)

g.addEdge(0,1,5)
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,
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值