广度优先搜索bfs C++实现

#include<iostream> 
#include<vector> 
#include<map> 
#include<queue> 
#include<set> 
using namespace std; 
 
vector<int> bfs(map<int, vector<int> > link, int top) 
{ 
    queue<int> qe;  //队列用来记录节点的遍历顺序 ,其实入队列的顺序也就是bfs查找的顺序 
    vector<int> order;//bfs查找的最后顺序 
    map<int, int> pre; //找到每个节点的前一个节点,可以根据这个关系算出任意两个节点的最短路径 
    set<int> qeset;  //因为队列不适合于查找,所以用set来记录队列中现存的元素,用于判断新节点是否在队列里 
    map<int, int> vis;  //当元素从队列中弹出,即已经访问过这个节点了,就将其存到map里 
 
    qe.push(top);  //先将起始点入队列 
    order.push_back(top); //top是bfs查找的第一个元素 
    qeset.insert(top); //给set里添加队列内的元素,set随队列而改变 
    int head,i=0; 
    while (!qe.empty())  //当队列非空时一直遍历该队列 
    { 
        head = qe.front();  //取队列的头元素 
        qe.pop();  //将该元素弹出 
        qeset.erase(head); //set随之删除head元素 
        vis[head] = 1;  //此时head元素被访问过,标记为1 
        for (i = 0; i < link[head].size(); i++)  //遍历与head节点相邻的节点 
        { 
            if (qeset.find(link[head][i]) == qeset.end() && vis.find(link[head][i]) == vis.end()) //当这个点不在队列里也没有被访问过,则入队列 
            { 
                pre[link[head][i]] = head;  //节点link[head][i]的前一个节点为head 
                qe.push(link[head][i]);  //将该节点入队列 
                qeset.insert(top);   //set相应插入对应元素 
                order.push_back(link[head][i]);  //bfs查找顺序添加该元素 
            } 
        } 
 
    } 
 
    map<int, int>::iterator it; 
    //cout << "preorder:" << endl; 
    //for (it = pre.begin(); it != pre.end(); it++) 
    //{ 
    //    cout << it->first << "->" << it->second << " "; 
    //} 
    //求距离top最远的节点的最大条数 
    head = order[order.size() - 1]; 
    i = 0; 
    while (pre.find(head) != pre.end()) 
    { 
        head=pre[head]; 
        i++; 
    } 
    cout << "距离top最远的节点的条数: "; 
    cout << i << endl; 
 
    cout << endl; 
    return order; 
} 
 
int main() 
{ 
    int x,top, m,n, i = 0; 
    map<int, vector<int> > link; 
    cin >> x; //输入多少组邻接关系 
    for (i = 0; i < x; i++) 
    { 
        cin >> m >> n; 
        link[m].push_back(n); //无向图所以两个方向都添加上关系 
        link[n].push_back(m); 
    } 
    cout << "top:" << endl; 
    cin >> top; 
    vector<int> order; 
    order = bfs(link, top); 
    cout << "order:" << endl; 
    for (i = 0; i < order.size(); i++) 
    { 
        cout << order[i] << " "; 
    } 
    cout << endl; 
}
//输入:
5
0 1
0 2
1 3
1 4
2 5
top:
5
//输出:
//距离top最远的节点的条数: 4 
//5 2 0 1 3 4
时间: 2024-10-13 12:04:33

广度优先搜索bfs C++实现的相关文章

广度优先搜索(BFS)

广度优先 Description: 阿狸被困在迷宫,snoopy要去救他,snoopy可以向上.下.左.右四个方向行走,每走一步(格)就要喝掉一瓶益力多.现在给它一个迷宫地图请问:snoopy最少需要多少瓶益力多才能走出迷宫? Input: 先输入一个数t,表示测试的数据个数, 下面输入的就是t个迷宫, 每个迷宫的输入都应包含以下数据, 输入迷宫的大小 n(n<=15),表示迷宫大小为n*n. 再输入迷宫, 用大写字母“S”表示snoopy的位置, 用小写字母“E”表示阿狸被困的位置, 用“.”

【算法导论】--C++实现广度优先搜索bfs

一.题目 根据上次随机生成的100个顶点的无向图和有向图,对其进行广度优先搜索. 二.理解广度优先搜索 广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的. [课上老师是这样说的,大家想象一下,发现其实非常形象] 广度优先搜索总是从一个起始点出发,首先扩散这个点周围所有的邻居,然后邻居在去扩散邻居的邻居(*^-^*)...然后一直到最后将整张图都扩散完. 三.代码实现 对于第一次随机生成100个顶点的图进行了细节的修改,将每个顶点的类型改为了自

深度优先搜索DFS和广度优先搜索BFS

DFS简介 深度优先搜索,从起点开始按照某个原则一直往深处走,直到找到解,或者走不下去,走不下去则回溯到前一节点选择另一条路径走,直到找到解为止. BFS简介 广度优先搜索,从起点开始先搜索其相邻的节点,由此向外不断扩散,直到找到解为止. 举例解释 从1开始去寻找5 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1 2.5     5.3 5出来则找到 遍历图中所有点 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1

算法与数据结构基础 - 广度优先搜索(BFS)

BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi

广度优先搜索BFS

广度优先搜索可以形成一个广度优先搜索树 算法时间为O(V+E),两重循环 输入:图g,起点start(int) 需要的数据结构:队列Q.color数组(存放每个顶点的颜色) 算法过程: 1. 预处理:1)color数组的每个值都赋为white(表示没被访问过):2)队列Q为空队列 2. 处理起点: 1)color[start]=gray,gray表示顶点已被访问,但其子节点未被处理(指的是入队列):2)Q.enQueue(start) 3. 循环以下操作,直到Q为空 1)int u=Q.deQu

PAT甲级——1091 Acute Stroke (广度优先搜索BFS)

本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/94207638 1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions

数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),

GraphMatrix::BFS广度优先搜索

查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, int j) //相对于顶点j的下一邻接顶点 { while ((-1 < j) && (!exists(i, --j))); return j; } //逆向线性试探(改用邻接表可提高效率) 对于图中的所有顶点,对每一个连通区域进行BFS: template <typename

关于宽搜BFS广度优先搜索的那点事

以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口并选择其他岔路.接下来将介绍的广度优先搜索(Breadth First Search, BFS)则是以广度为第一关键词,当碰到岔道口时,总是先一次访问从该岔道口能直接到达的所有节结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,以此类推,直到所有结点都被访问为止.这就跟平静的水面