数据结构(C++)——图的遍历算法:广度优先搜索、深度优先搜索、优先级搜索算法

本文介绍了图的遍历算法,包括广度优先搜索(BFS)、深度优先搜索(DFS)和优先级搜索。BFS采用队列进行层次遍历,DFS则通过递归实现类似树的先序和后序遍历,而PFS是基于优先级选择顶点的搜索策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的遍历算法

图的遍历都可以理解为,将非线性结构转化为半线性结构的过程。经遍历而确定的边类型中,最重要的一类即所谓的树边,它们与所有顶点共同构成了原图的一棵支撑树(森林),称作遍历树(traversal tree)。

 

 

广度优先搜索(BFS)

广度优先搜索(breadth-first search, BFS)采用的策略,可概括为:

    越早被访问到的定点,其邻居越优先被选用

 

于是,始自图中顶点s的BFS搜索,将首先访问顶点s;再依次访问s所有尚未访问到的邻居;再按后者被访问的先后次序,逐个访问它们的邻居;...;如此不断。在所有已访问到的顶点中,仍有邻居尚未访问者,构成所谓的波峰集(frontier)。

    广度优先搜索类似与树的层次遍历。

 

广度优先搜索算法实现:(BFS算法)

template <typename Tv, typename Te> //广度优先搜索BFS算法(全图)
void Graph<Tv, Te>::bfs(int s) { //assert: 0 <= s < n
    reset(); int clock = 0; int v = s; //初始化
    do //逐一检查所有顶点
        if (UNDISCOVERED == status(v)) //一旦遇到尚未发现的顶点
            BFS(v, clock); //即从该顶点出发启动一次BFS
    while (s != (v = (++v % n))); //按序号检查,故不漏不重
}

template <typename Tv, typename Te> //广度优先搜索BFS算法(单个连通域)
void Graph<Tv, Te>::BFS(int v, int& clock) { //assert: 0 <= v < n
    Queue<int> Q; //引入辅助队列
    status(v) = DISCOVERED; Q.enqueue(v); //初始化起点
    while (!Q.empty()) { //在Q变空之前,不断
        int v = Q.dequeue(); dTime(v) = ++clock; //取出队首顶点v
        for (int u = firstNbr(v); -1 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值