国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Python > 正文

python圖的深度優先和廣度優先算法實例分析

2024-09-09 19:02:18
字體:
來源:轉載
供稿:網友

本文實例講述了python圖的深度優先和廣度優先算法。分享給大家供大家參考,具體如下:

首先有一個概念:回溯

回溯法(探索與回溯法)是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇并不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。

深度優先算法:

(1)訪問初始頂點v并標記頂點v已訪問。
(2)查找頂點v的第一個鄰接頂點w。
(3)若頂點v的鄰接頂點w存在,則繼續執行;否則回溯到v,再找v的另外一個未訪問過的鄰接點。
(4)若頂點w尚未被訪問,則訪問頂點w并標記頂點w為已訪問。
(5)繼續查找頂點w的下一個鄰接頂點wi,如果v取值wi轉到步驟(3)。直到連通圖中所有頂點全部訪問過為止。

廣度優先算法:

(1)頂點v入隊列。
(2)當隊列非空時則繼續執行,否則算法結束。
(3)出隊列取得隊頭頂點v;訪問頂點v并標記頂點v已被訪問。
(4)查找頂點v的第一個鄰接頂點col。
(5)若v的鄰接頂點col未被訪問過的,則col入隊列。
(6)繼續查找頂點v的另一個新的鄰接頂點col,轉到步驟(5)。直到頂點v的所有未被訪問過的鄰接點處理完。轉到步驟(2)。

代碼:

#!/usr/bin/python# -*- coding: utf-8 -*-class Graph(object):  def __init__(self,*args,**kwargs):    self.node_neighbors = {}    self.visited = {}  def add_nodes(self,nodelist):    for node in nodelist:      self.add_node(node)  def add_node(self,node):    if not node in self.nodes():      self.node_neighbors[node] = []  def add_edge(self,edge):    u,v = edge    if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]):      self.node_neighbors[u].append(v)      if(u!=v):        self.node_neighbors[v].append(u)  def nodes(self):    return self.node_neighbors.keys()  def depth_first_search(self,root=None):    order = []    def dfs(node):      self.visited[node] = True      order.append(node)      for n in self.node_neighbors[node]:        if not n in self.visited:          dfs(n)    if root:      dfs(root)    for node in self.nodes():      if not node in self.visited:        dfs(node)    print order    return order  def breadth_first_search(self,root=None):    queue = []    order = []    def bfs():      while len(queue)> 0:        node = queue.pop(0)        self.visited[node] = True        for n in self.node_neighbors[node]:          if (not n in self.visited) and (not n in queue):            queue.append(n)            order.append(n)    if root:      queue.append(root)      order.append(root)      bfs()    for node in self.nodes():      if not node in self.visited:        queue.append(node)        order.append(node)        bfs()    print order    return orderif __name__ == '__main__':  g = Graph()g.add_nodes([i+1 for i in range(8)])g.add_edge((1, 2))g.add_edge((1, 3))g.add_edge((2, 4))g.add_edge((2, 5))g.add_edge((4, 8))g.add_edge((5, 8))g.add_edge((3, 6))g.add_edge((3, 7))g.add_edge((6, 7))print "nodes:", g.nodes()order = g.breadth_first_search(1)order = g.depth_first_search(1)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 区。| 太仓市| 华宁县| 汝城县| 吉隆县| 柳江县| 九寨沟县| 宜阳县| 江川县| 托里县| 怀集县| 宁陕县| 阿克陶县| 肃南| 历史| 炉霍县| 沐川县| 平南县| 日照市| 萨嘎县| 集贤县| 和田县| 凤翔县| 延津县| 蓝田县| 仁布县| 伊宁县| 上虞市| 蒙阴县| 湟源县| 浮山县| 饶阳县| 同江市| 乌拉特前旗| 门源| 黄山市| 旺苍县| 平泉县| 汤阴县| 南雄市| 达日县|