zoukankan      html  css  js  c++  java
  • 最短路径问题与广度优先搜索

    解决最短路径问题的算法被称为广度优先(breadth-first search,BFS)搜索。

    广度优先搜索是一种用于图的查找算法,可解决两类问题:

    从节点A出发,有前往节点B的路径吗?

    从节点A出发,前往节点B的哪条路径最短?

    最短路径问题的解决步骤:

    1.使用图建立问题模型;

    图用于模拟不同的东西是如何相连的。

    2.使用广度优先搜索解决问题。

    广度优先搜素算法从邻居节点及邻近节点的邻居节点中搜索,直到搜索到目标。

    首先搜索一度 关系,再搜索二度关系 ,然后三度关系,......

    因此,广度优先搜索不仅查到从A到B的路径,而且找到的是最短的路径。

    只有按添加顺序查找时,才能实现这样的目的;可以使用队列(queue)来实现。

    队列工作原理:先进先出(First In First Out,FIFO)。

    队列操作:入队,出队。

    图的实现:

    图由一系列的节点和边组成;每个节点都与邻近节点相连,可以使用散列表来实现图。

    散列表是无序的,添加键-值对的顺序是无关的。

    1.图的表示(每个节点都与邻近节点 相连,散列表)

    2.算法实现

    from collections import deque
    graph = {}
    graph["you"] = {"alice", "bob", "claire"}
    # 一度关系
    graph["alice"] = ["peggy"]
    graph["bob"] = ["anuj", "peggy"]
    graph["claire"] = ["thom","jonny"]
    # 二度关系
    graph["peggy"] = []
    graph["anuj"] = []
    graph["thom"] = []
    graph["jonny"] = []


    # 判断name是否以m结尾
    def person_is_seller(name):
    return name[-1] == 'm'


    # breadth-first-search(BFS)
    def search(name):
    search_queue = deque() # 创建队列
    search_queue += graph[name] # 将邻近加入到创建的搜索队列中
    searched = [] # 记录搜索过的人,防止形成无限循环
    while search_queue:
    person = search_queue.popleft() # 出队
    if person not in searched: # 是否位目标
    if person_is_seller(person):
    print("%s is a seller" %(person))
    else:
    search_queue += graph[person] # 不是,将邻近加入到搜索队列
    searched.append(person) # 加入到已经搜索过的列表
    return False


    if __name__ == '__main__':
    search("you")
  • 相关阅读:
    我不想写题解的题们
    [清华集训2012]模积和
    2013杭电warm up1 Rotation Lock Puzzle
    2013杭电warm_up1 1010 Difference Between Primes
    2013 Multi-University Training Contest 3 (g) The Unsolvable Problem
    2013杭电warm up1 1002 Pet 求树结点的高度
    hdu 3789 奥运排序问题 模拟
    13杭电warmup1 1001 Children's Day
    2013杭州网络预选赛 1004 Save Labman No.004 求异面直线之间距离
    2013成都网络预选赛 1010 A Bit Fun
  • 原文地址:https://www.cnblogs.com/songyuejie/p/11374406.html
Copyright © 2011-2022 走看看