宽度优先搜索(BFS)
2016-07-12 14:31
204 查看
BFS,其英文全称是Breadth First Search。
思路:
从图中某个节点出发,将该结点入队,标记为已访问。然后输出队列的队首(第一次为起点),将队首从队列中删除,访问该结点的邻接表,将未标记的相邻结点入队,并且标记为已访问。接下来循环操作第二句话。
按照上边的图,假设出发点为0。0入队,将0标记为已访问,输出0,将0从队列中删除,访问0的邻接表,将1和4入队,并且都标记为已访问。那么,接下来,队首为1,输出1,将1从队列中删除,访问1的邻接表,将2和3入队。此时队首为4,输出4,将4从队列中删除,4的邻接表为空。此时队列不为空,队首为2,将2输出,将2从队中删除,2的邻接表为空,将3输出,将3从队中删除,3的邻接表为空,队列为空,完成遍历。
代码:
其中有使用c++11特性,或者可以用上边注释部分
0 1 4 2 3
思路:
从图中某个节点出发,将该结点入队,标记为已访问。然后输出队列的队首(第一次为起点),将队首从队列中删除,访问该结点的邻接表,将未标记的相邻结点入队,并且标记为已访问。接下来循环操作第二句话。
按照上边的图,假设出发点为0。0入队,将0标记为已访问,输出0,将0从队列中删除,访问0的邻接表,将1和4入队,并且都标记为已访问。那么,接下来,队首为1,输出1,将1从队列中删除,访问1的邻接表,将2和3入队。此时队首为4,输出4,将4从队列中删除,4的邻接表为空。此时队列不为空,队首为2,将2输出,将2从队中删除,2的邻接表为空,将3输出,将3从队中删除,3的邻接表为空,队列为空,完成遍历。
代码:
#include <iostream> #include <cstring> #include <cstdlib> #include <vector> #include <queue> using namespace std; class Graph { private: int n; bool *visited; //代表节点是否被访问 vector<int> *edges; //邻接表 public: Graph(int _n){ n = _n; visited = new bool ; edges = new vector<int> ; memset(visited, 0, sizeof(visited)); } ~Graph(){ delete []visited; delete []edges; } void myInsert(int x, int y){ edges[x].push_back(y); edges[y].push_back(x); } void bfs(int startNode){ queue<int> bfsQueue; bfsQueue.push(startNode); visited[startNode] = true; while(!bfsQueue.empty()){ int temp = bfsQueue.front(); cout<<temp<<endl; bfsQueue.pop(); // vector<int>::iterator it; // for(it = edges[temp].begin(); it!=edges[temp].end(); it++){ // if(!visited[*it]){ // bfsQueue.push(*it); // visited[*it] = true; // } // } //c++11特性,或者可以用上面注释的写法 for(int i:edges[temp]){ if(!visited[i]){ bfsQueue.push(i); visited[i] = true; } } } } }; int main(){ int n, m, k; cin>>n>>m; //n个节点 Graph g(n); //m条边 for(int i=0; i<m; i++){ int x, y; cin>>x>>y; g.myInsert(x, y); } //输入bfs开始的点 cin>>k; g.bfs(k); system("pause"); return 0; }
其中有使用c++11特性,或者可以用上边注释部分
相关文章推荐
- ios开发原生的扫描二维码的实现以及限制扫描区域rectOfInterest遇到的一些坑
- 匿名内部类new 父类或者接口(){定义子类的内容(如函数等)}
- Xilinx ISE在Win10下的一些问题。
- Linux下安装PCRE
- linq to entity查询的日期格式化
- [BZOJ4554][JZOJ4612] 【TJOI&HEOI2016】D2T1 游戏
- Spark on yarn的内存分配问题
- 初画PCB的一些技巧和规则总结
- 用JAVA后台判断一个URL是否有效
- rand_mode使用注意
- 在SpringMVC中获取request对象的几种方式
- constructor-arg的使用以及Properties的使用
- Django高级视图和URL配置
- 动态Lambda进阶一
- <stdlib.h>包括的函数讲解 (
- java反射机制
- 一网友学Android的经验及弯路提醒
- mysql授权某主机
- 《APUE.3E》习题4.6编写自己的cp(l)程序,它复制包含空洞的文件,但不将字节0包含到输出文件中去
- C#深入浅出全接触(四)