无戒学堂:365天极限挑战日更营

数据结构 | 图和图算法

2020-03-20  本文已影响0人  水土七口刀

三要素

二概念

图 抽象数据类型(Abstract Data Type,ADT)相关定义

图的两种实现方法

图的python实现

#Vertex
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]
#graph
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())

广度优先搜索(BFS)算法

已知一个图 G 和它的一个起始顶点 s,广度优先搜索(BFS)通过搜索图中的边来找到图 G 中所有和 s 有路径相连的顶点。
其显著的特点是在搜索达到距离 k+1 的顶点之前,BFS 会找到全部距离为 k 的顶点。有一个很好的方法去想象广度优先搜索(BFS)的运行原理,那就是建造一棵以 s 为根的树的过程,一次建造树的一层,同时,广度优先搜索(BFS)在增加层次前,会保证将始顶点所有的子顶点都添加在了树中。
为了进一步追踪这一过程,这里的 BFS 算法在搜索过程中,会给每一个顶点染色为白色、灰色或黑色。每一个顶点在被构建时都被初始化为白色,在这之后,白色代表的是尚未被发现的顶点。当一个顶点被第一次发现后,它被染成灰色,当广度优先搜索(BFS)完全探索完一个顶点后,它被染成黑色。
这意味着一旦一个节点染成了黑色,它就没有邻近的白色节点;而另一方面,如果一个顶点被标识为了灰色,这就意味着其附近可能还存在着未探索的顶点等待被探索。

深度优先搜索(DFS)算法。

BFS(广度优先搜索算法)是一次建立搜索树的一层,而 DFS 算法则是尽可能深的搜索树的一枝。

拓扑排序

上一篇 下一篇

猜你喜欢

热点阅读