【算法日记】广度优先算法

广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。广度优先搜索让你能够找出两样东西之间最短的距离。在学习这个算法之前我们要了解图的概念

1.什么是图

如上图所示。图是有节点和边组成的。一个节点可能和很多节点直接相连,这些相邻的节点就被称作邻居

2.广度优先搜索

常常我们有这样一个问题,从一个起点开始要到一个终点,我们要找寻一条最短的路径

广度优先搜索可解决两个问题

从A到E有路径么?

从A到E的路径有那些?

A->B->E

A->D->E

A->C->D->E

假设每个节点间的距离是相等的。那么A到E的最短距离就是

A->B->E

A->D->E

广度优先搜索是这样做的。搜索范围从起点开始向外延伸。先检查一度关系,在检查二度关系,以此类推。直到遍历所有节点

3.算法实现

用字典保存图信息

route={
        "A":["B","C","D"],    # 起点
        "B":["E"],
        "C":["D"],
        "D":["E"],
        "E":[]    # 终点
    }
def searchRoute():
    """
    路线算法
    """
    route={
        "A":["B","C","D"],    # 起点
        "B":["E"],
        "C":["D","F"],
        "D":["B","H"],
        "E":["H"],
        "F":["G"],
        "G":["H"],
        "H":[]    # 终点
    }

    path=[]

    start="A"
    end="H"

    def search(string):
        print string
        point=string[-1]
        print point
        print route[point]
        # # 如果有邻居存在
        if route[point]:
            for each in route[point]:
                if each==end:
                    path.append(string+each)
                    break
                else:
                    newPath=string+each
                    search(newPath)
    if route[start]:
        for item in route[start]:
            new=start+item
            search(new)

    print path

最后出来的结果是数组包含A到E的所有路径

ps:图分有向图和无向图两种,节点之间关系是单向的是有向图。直接用直线的是五向图。有兴趣的可以多了解下。上面的例子用的是有向图

时间: 2024-10-09 19:58:45

【算法日记】广度优先算法的相关文章

深度优先算法和广度优先算法

算法:深度优先算法和广度优先算法(基于邻接矩阵) 1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法. 另一种是基于链表的的邻接表. 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接. 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称. 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的): 我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 矩阵图的数据

邻接表的深度优先算法和广度优先算法--p140和p142

源程序: #include <stdio.h>#include <stdlib.h> #define vnum 100 typedef char VerTexType; //定义链接队列的结点typedef struct LinkQueueNode{ int data1; struct LinkQueueNode *next;}LKQueNode; //定义队列,队列有头指针和尾指针typedef struct LKQueue{ LinkQueueNode *front,*rear

OpenCV二值图求最大连通区域算法(广度优先算法 BFS)

#include <iostream> #include <opencv2\opencv.hpp> #include <vector> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <windows.h> #include <math.h> #include <queue> using namespace std;usin

【算法日记】Dijkstra最短路径算法

上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算法实现 # Dijkstra算法--通过边实现松弛 # 指定一个点到其他各顶点的路径--单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, 3:{3:0, 5:5}, 4:{3:4, 4:0, 5:13, 6:15}, 5:{5:0

BFS广度优先算法的思路

广度优先算法的思想是 对所有的Node进行遍历 然后将第一个Node入队列 设置其visited为真 然后 对第一个Node跟其它剩余的Node进行遍历对比 找出连通的Node 并将其visited属性赋值为真 然后将其入队列 接下来对队列里面的Node进行迭代处理 最终完全遍历所有节点

树图 广度优先算法和深度优先算法

原文链接: ????????深度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098342257387/ ????????广度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098711040303/ 树图 广度优先算法和深度优先算法

深度优先与广度优先算法

图的遍历有深度优先和广度优先算法. 深度优先遍历可描述为一个递归算法.当到达顶点v时,具体操作是: ①访问(v); ②for(与v相邻的每个顶点w) 遍历(w): //深度优先算法 template<int max_size> void Diagraph<max_size>::depth_first(void(*visit)(Vertex &)) const { bool visited[max_size]; //引入数组防止无限循环 Vertex v; for (all

C语言之广度优先算法

广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标节点(节点就是那些圆球球,其中有一个或者多个是目标节点)或者搜完了整个图都没找到目标节点就停止搜索. 实现这个要是想用像深度优先算法那样函数套函数那样是难以实现的(至少我实现不了). 像这样的: 求问从A到B的最短路径的节点数是多少? 这道题很简单嘛,肯定是A-C-B啊,答案是3啊.那怎样用C语言实现呢? 深搜的话:一条路一条路读取,取节点数最小的,也可以,但是问题来了,当节点数特别多,图非常“辽阔

广度优先算法:迷宫问题

广度优先算法: 模拟队列:数据量较小,需要打印路径坐标 STL队列:数据量较大,只需要打印步数 迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. Input 一个5 × 5的