BFS算法C++实现(邻接表存储)
背景:
王道数据结构使用伪代码讲解图,这样虽然方便理解,但是没有具体实现,在网上找bfs算法C++实现模版也没找到,暂时写一个充当模版吧
BFS算法C++模版:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
// 定义BFS函数,使用邻接表存储
int bfs(vector<vector<int>> &graph, int start, vector<bool> &visited){ // 传入参数:图,开始点// 把点传入队列,queue<int> q;q.push(start); // 初始化访问数组,并标记访问int n = graph.size();visited[start] = true;// 判断:队列非空while(!q.empty()){// 取出头结点,int v = q.front();q.pop();cout << v << " ";cout << "\n" ;// 访问邻接点,加入队列for(int tem:graph[v]){cout <<"Tem:" << tem ;if(!visited[tem]){q.push(tem);visited[tem]= true;}}}return 0;
}// BFS遍历非连通图
void bfsTraverse(vector<vector<int>> &graph){// 计算顶点数int n = graph.size();vector<bool> visited(n, false);// 遍历所有顶点,对每个顶点执行一次bfsfor(int i=0;i<n;i++){if(!visited[i]){bfs(graph,i, visited);}}}// 调用BFS函数
int main(){// 定义邻接表vector<vector<int>> graph={// 分量1(顶点0-3):三角形环 + 分支(0-1-2-0 环,3仅连1/2,与0不直接连通){1, 2}, // 0: 连1、2(环的两边){0, 2, 3}, // 1: 连0、2(环) + 3(分支,打破全连通){0, 1, 3}, // 2: 连0、1(环) + 3(分支,与1形成对3的双向连接){1, 2}, // 3: 仅连1、2(与0无直接边,分量1内形成“环+分支”子结构)// 分量2(顶点4-6):链式环 + 自环(4→5→6→4 环,5带自环,6连4/5){5, 6}, // 4: 连5(链起点) + 6(反向连,形成环){4, 6, 5}, // 5: 连4(链) + 6(环) + 自环(5→5,特殊边){4, 5}, // 6: 连4、5(闭合环,无额外边,与分量1结构差异)// 分量3(顶点7-9):星型+环(7为中心,8-9形成环,7连8/9,9连8,8不连7以外的节点){8, 9}, // 7: 连8、9(中心节点,无自环){9}, // 8: 仅连9(与9形成环,不连7以外节点,打破星型全连接){7, 8} // 9: 连7(中心) + 8(环,与8双向)};// 调用BFS函数cout << "BFS遍历:";bfsTraverse(graph);cout << endl;return 0;
}