DFS & BFS

1.DFS & BFS

深度优先算法
(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)。

class Grapy(object):
    """docstring for Grapy"""
    def __init__(self, *arg,graph={}):
        self.graph = graph
        self.visited = {}

    def depth_first_traverse(self,root=None):
        result=[]

        def dft(node):
            self.visited[node]=True
            result.append(node)
            for n in self.graph[node]:
                if not n in self.visited:
                    dft(n)

        if root:
            dft(root)

        return result

    def breadth_first_traverse(self,root=None):
        queue = [root]
        result = [root]
        def bft():
            while queue:
                node = queue.pop(0)
                self.visited[node] = True
                for n in self.graph[node]:
                    if (not n in self.visited) and (not n in queue):
                        queue.append(n)
                        result.append(n)
        if root:
            bft()

        return result
posted @ 2016-12-02 20:11  BinWone  阅读(166)  评论(0编辑  收藏  举报