當前位置 主頁 > 服務器問題 > Linux/apache問題 > 最大化 縮小

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

    欄目:Linux/apache問題 時間:2019-11-04 10:36

    本文實例講述了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 order
    if __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)
    
    
    
在线观看中文字幕理论片