ACM_程序设计竞赛:穷举法:BFS(广度优先)
2016-04-01 01:10
309 查看
类似于层次遍历
首先访问起始顶点v,
v出发,依次访问领接的顶点w1,w2,...,wiw_1,w_2,...,w_i
不后退,一步可以访问一批结点
//结果:abcdefgh
![](http://img.blog.csdn.net/20160331213608575)
复杂度
借助队列工作:空间复杂度:O(|V|)
领接矩阵:查找每个顶点的时间复杂度是O(|v|2)O(|v|^2)
领接表:查找的时间(O(|E|)),访问的时间O(|v|); 总时间=O(|V|+|E|)
限制条件:N,M<=100
算法:
有近及远的顺序操作
将访问过的状态标注
d
[M]数组表示最短距离
首先访问起始顶点v,
v出发,依次访问领接的顶点w1,w2,...,wiw_1,w_2,...,w_i
不后退,一步可以访问一批结点
//结果:abcdefgh
//算法: bool visited[MAX_VERTEX_NUM];//访问标记数组 void BFSTraverse(Graph G){ //图G进行广度优先遍历,设访问函数visit() for(i=0;i<G.vexnum;++i) visited[i]=FALSE InitQueue(Q); //初始化辅助队列 for(i=0;i<G.vexnum;++i) //从0开始遍历 if(!visited[i]) //对每个连通分量调用BFS BFS(G,i); //vi 未访问,从vi开始BFS } void BFS(Graph G, int v){ visit(v); // 访问初始化顶点v visited[v]=TRUE; //对v做标记 Enqueue(Q,v); //顶点v入队 while(!isEmpty(Q)){ DeQueue(Q,v); //顶点v出队列 for(w=FristNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)) //检查v的所有领接点 if(!visited[w]) //w是尚未检查的顶点 visited(w); //访问顶点 visited[w]=TRUE; //标记w EnQueue(Q,w); //顶点w入队列 } }
复杂度
借助队列工作:空间复杂度:O(|V|)
领接矩阵:查找每个顶点的时间复杂度是O(|v|2)O(|v|^2)
领接表:查找的时间(O(|E|)),访问的时间O(|v|); 总时间=O(|V|+|E|)
迷宫最短路径
给定一个大小是N*M的迷宫,每一步向领接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数限制条件:N,M<=100
* 输入 N=10,M=10 #: 墙壁;.:通道; S:起点 G:终点 #S######## ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G# 输出:22
算法:
有近及远的顺序操作
将访问过的状态标注
d
[M]数组表示最短距离
#include <stdio.h> #include <string.h> #include <queue> using namespace std; struct node { int x,y,step; }; char map[105][105]; int vis[105][105]; int to[4][2]= {1,0,-1,0,0,1,0,-1}; int n,m,sx,sy,ex,ey,ans; int check(int x,int y) { if(x<0 || x>=n || y<0 || y>=m) return 1; if(vis[x][y] || map[x][y]=='#') return 1; return 0; } void bfs() { int i; queue<node> Q; node a,next; a.x = sx; a.y = sy; a.step = 0; vis[a.x][a.y]=1; Q.push(a); while(!Q.empty()) { a = Q.front(); Q.pop(); if(map[a.x][a.y]=='E') { ans = a.step; return ; } for(i = 0; i<4; i++) { next = a; next.x+=to[i][0]; next.y+=to[i][1]; if(check(next.x,next.y)) continue; next.step=a.step+1; vis[next.x][next.y] = 1; Q.push(next); } } ans = -1; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); int i,j; for(i = 0; i<n; i++) scanf("%s",map[i]); for(i = 0; i<n; i++) { for(j = 0; j<m; j++) { if(map[i][j]=='S') { sx = i; sy = j; } } } memset(vis,0,sizeof(vis)); bfs(); printf("%d\n",ans); } return 0; }
相关文章推荐
- Java的引用传递和值传递
- JavaScript语言精粹笔记
- LeetCode Happy Number
- Linux内核第六节 20135332武西垚
- C#第一篇之性能优化
- Hadoop学习第一章_初识Hadoop
- 5. Longest Palindromic Substring
- Inside Flask - app.py - 1
- [linux]因python升级导致的yum命令无法执行
- 十大热门的大数据技术
- Day 2 of traveling
- Strata + Hadoop World北京大会招募讲师
- DateTime的日期格式
- 二、OpenStack入门 之 架构分析
- ViewPager+Fragment的预加载问题
- Java面试宝典2015版(绝对值得收藏超长版)(一)
- 学python过程中遇到的一些问题及解决方法
- 今天惊喜的发现,又可以用最新版的JetBrain了
- iOS 后台线程
- Ubuntu下编译安装OpenCV 2.4.7并读取摄像头