关于BFS的小节
来源:互联网 发布:win7恢复网络设置方法 编辑:程序博客网 时间:2024/06/05 01:06
BFS(广度优先搜索)的一些微小的应用
关于BFS
按照本蒟蒻自己的理解广度优先搜索(以下称BFS)是一种基于层数的搜索方式,相较于深度优先搜索(以下称DFS),BFS的搜索方式更类似于辐射状而不是DFS一样的线性搜索。所以在实际的运用中,BFS在最短路问题以及覆盖面积一类的问题中有着非常大的优势。以下写出一道BFS在最短路问题的应用。
FZOJ 1431: BFS找最短路
题目描述:
下图表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现给给出一个城市的路线图,并给出起点与终点,请给出最短的路线。
!
输入:
第一行三个数,分别是起点城市,目标城市,线路条数n。
接下来n行,每行两个数字,表示这两个城市之间有线路。
注意:输入数据中1表示城市A,2表示城市B……(你应该知道数据范围了吧?)
输出
输出路线一行,用->表示箭头,具体格式见样例。
样例输入
1 8 12
1 2
1 3
1 4
1 6
2 6
3 4
3 5
4 7
5 7
5 8
6 8
7 8
样例输出
A->F->H
解题思路
首先思考DFS的可行性,根据深度优先的原则,我们会优先搜索当前节点可以到达的下一个节点,直到搜索到目标节点,返回长度值。粗略计算可得算法复杂度会在O(n^k)(n代表城市数,k代表每个城市连接几个城市)左右。本题数据范围较小,如果剪枝得当,也许可以AC,由于本蒟蒻相当之懒,剪枝技能炒鸡辣鸡,所以DFS算法就不在这里多赘述了。
关于本题BFS的优势就体现在,BFS搜索方式是*按层搜索,一层一层逐步搜索,所以搜索到结果时,必定是最短路。粗略计算了一下,算法复杂度会在O(nk)左右,比起DFS复杂度的指数级增长,这个复杂度感觉相当良心有木有?
甩出代码
由于本蒟蒻异常喜欢写SPFA,导致写BFS时经常写的很像SPFA,各位大佬、巨佬、神犇、巨友(这是什么鬼??)见谅……
#include<cstdio>#include<cstring>#include<algorithm>#include<queue>//对于懒的人,就要用懒的STLusing namespace std;const int MAXN=27;queue <int> s[MAXN];//强行用队列来存矩阵(表示对链表深恶痛绝)queue <int> que;bool vis[MAXN];//dist是距离,last_point是存储上一个点的由来int dist[MAXN],last_point[MAXN],n,a,b,u,point,Start,End;void search(int a){//使用递归的方式寻找路径 if(a==Start){ printf("%c",Start+'A'-1); return; } search(last_point[a]); printf("->%c",a+'A'-1); return;}int main(){ memset(vis,0,sizeof vis); memset(dist,126/3,sizeof dist); scanf("%d%d%d",&Start,&End,&n); for(int i=1;i<=n;i++){ scanf("%d%d",&a,&b); s[a].push(b); s[b].push(a); } //广度优先搜索 que.push(Start); vis[Start]=true; dist[Start]=0; while(!que.empty()){ u=que.front(); vis[u]=false; que.pop(); n=s[u].size(); for(int i=1;i<=n;i++){ point=s[u].front(); s[u].pop(); if(dist[point]>dist[u]+1){ dist[point]=dist[u]+1; last_point[point]=u; if(!vis[point]){ vis[point]=true; que.push(point); } } } } search(End);}
咳咳,代码果然很丑,看来还是要提高志几的恣肆水平……就这样吧!写的很烂,不要介意!
THE END
- 关于BFS的小节
- 关于sleep函数的小节
- 关于Kmp算法的一点小节
- 关于UILabel标签控件的使用小节
- 关于BeanUtil的理解与小节
- 关于ios实现键盘隐藏的方法小节
- 关于BFS的总结
- 关于CPU和内存小节
- tableView的小节
- phpstorm的一些小节
- hdu1728 关于bfs的理解
- 小节
- 小节
- 关于《C语言深度解剖》4.1.5编译器的bug小节
- 关于《C语言深度解剖》4.1.5编译器的bug小节
- STL中 迭代器的小节
- Symbian的体系架构小节
- IOS NSIndexSet的使用小节
- BZOJ 4556 [HEOI 2016] str
- android文本框左右加减按钮长按一直加减
- mysql 减少group by 的开销
- JQery实现Checkbox至少保证有一个选中
- LeetCode Summary STL Stack Queue
- 关于BFS的小节
- 朴素贝叶斯
- 安装 JDK
- 最短的名字
- redis 安装 多实例配置 基本命令使用
- LeetCode Summary Tree
- Linux一键部署web环境并创建WordPress博客
- 如何禁用Chrome浏览器的自动保存密码提示
- Activity进入与退出的动画