博客
关于我
连通图里的深度优先和广度优先遍历
阅读量:758 次
发布时间:2019-03-22

本文共 1723 字,大约阅读时间需要 5 分钟。

与图的遍历密切相关的两个核心算法是深度优先搜索(DFS)和广度优先搜索(BFS)。这两个算法分别以不同的策略访问图中的所有顶点,适用于不同的应用场景。

深度优先遍历DFS

DFS的核心思想是沿着图中的边尽可能深入访问顶点,形成一种“深入后回溯”的探索路径。具体来说,选择一个起始顶点后,首先访问它,然后依次访问其邻接未访问的顶点,继续访问这些顶点的邻接顶点,直到无法继续深入为止。这一过程中,当一个顶点的所有邻接顶点均被访问时,系统会回溯到最近未访问的前一个顶点,继续探索其邻接顶点。

DFS在邻接表存储结构下的实现通常采用递归方式。其核心逻辑包括:

  • 标记当前顶点为已访问。
  • 遍历该顶点的所有邻接顶点。
  • 对于未被访问的邻接顶点,递归性地启动DFS。
  • 当当前顶点的所有邻接顶点均被访问后,退出递归。
  • 广度优先遍历BFS

    相较于DFS,BFS更注重访问顶点的“广度优先”特性。其过程是从起始顶点出发,逐层访问其所有邻接顶点,然后再向下一层次的顶点进行扩展,类似于层次遍历。这种方式最大程度地尽量平铺地访问所有顶点。

    BFS的实现需要使用一个队列来管理需要访问的顶点。其步骤如下:

  • 初始化队列,将起始顶点入队并标记为已访问。
  • iteratively出队取出队首顶点,访问其所有未被访问的邻接顶点,并将这些新的顶点入队。
  • 重复上述过程,直到队列为空为止。
  • 邻接矩阵与邻接表的转换

    在实际应用中,图的表示方式会影响算法的实现。邻接矩阵适用于小型图,直接通过数组索引快速获取任意顶点的邻接顶点。而邻接表则更为灵活,尤其在大型图中表现更优。代码实现中,邻接矩阵到邻接表的转换与邻接表到邻接矩阵的逆转换都是常见操作。

    算法实现示例

    以下是基于邻接表的DFS和BFS实现代码示例:

    int visited[MAXV];
    // 深度优先搜索
    void dfs(ALGraph *G, int v) {
    visited[v] = 1;
    printf("%d\n", v);
    ArcNode *p = G->adjlist[v].firstarc;
    while (p != NULL) {
    if (!visited[p->adjvex]) {
    dfs(G, p->adjvex);
    }
    p = p->nextarc;
    }
    }
    // 广度优先搜索
    void bfs(ALGraph *G, int v) {
    int front = 0, rear = 0, qsize[MAXV];
    int visited[MAXV] = {0};
    queue[bfs]:这个代码存在问题,需要修正
    while (front != rear) {
    front = (front + 1) % MAXV;
    w = queue[front];
    p = G->adjlist[w].firstarc;
    while (p != NULL) {
    if (!visited[p->adjvex]) {
    visited[p->adjvex] = 1;
    printf("%d\n", p->adjvex);
    rear = (rear + 1) % MAXV;
    queue[rear] = p->adjvex;
    }
    p = p->nextarc;
    }
    }
    }

    代码扩展与实现细节

    在实际开发中,需要注意以下几点:

  • 邻接表转换代码的正确性。
  • 邻接矩阵的初始化与更新操作。
  • 队列实现的线性搜索性能问题。
  • 内存管理与错误处理。
  • 通过上述实现,可对图的结构进行深度优先和广度优先遍历。不同算法的选择依赖于具体应用需求,例如查找路径时BFS更为合适,而探索可能的路径时DFS更为适用。

    转载地址:http://icgwk.baihongyu.com/

    你可能感兴趣的文章
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NHibernate学习[1]
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>