bfs求最短路的几道例题

题目来自于记蒜客数据结构课,类型差不多,都是用bfs求最短路(注意是不加权的最短路,加权的情况后面的文章会讲)。

代码如下:

  1 //记蒜客习题
  2 //bfs求某点到其他各点的最短距离
  3 #include <iostream>
  4 #include <cstring>
  5 #include <queue>
  6 using namespace std;
  7
  8 class Graph{
  9 private:
 10     int n;
 11     bool *visited;
 12     int **mat;
 13     int *distance;
 14 public:
 15     Graph(int input_n){
 16         n=input_n;
 17         visited=new bool[n];
 18         memset(visited,0,n);
 19         mat=new int*[n];
 20         for(int i=0;i<n;i++){
 21             mat[i]=new int[n];
 22             memset(mat[i],0,sizeof(int)*n);
 23         }
 24         distance=new int[n];
 25         memset(distance,0,sizeof(int)*n);
 26     }
 27
 28     ~Graph(){
 29         delete[] visited;
 30         for(int i=0;i<n;i++){
 31             delete[] mat[i];
 32         }
 33         delete[] mat;
 34         delete[] distance;
 35     }
 36
 37     void insert(int x, int y){
 38         mat[x-1][y-1]=1;
 39         mat[y-1][x-1]=1;
 40     }
 41
 42     void calculate(int start_ver){
 43         int cur_ver;
 44         int start=start_ver-1;
 45         queue<int> temp;
 46         temp.push(start);
 47         visited[start]=true;
 48         while(!temp.empty()){
 49             cur_ver=temp.front();
 50             temp.pop();
 51             for(int adj=0;adj<n;adj++){
 52                 if(!visited[adj] && mat[cur_ver][adj]==1){
 53                     distance[adj]=distance[cur_ver]+1;
 54                     temp.push(adj);
 55                     visited[adj]=true;
 56                 }
 57             }
 58         }
 59     }
 60
 61     void print_dis(){
 62         for(int i=0;i<n;i++){
 63             cout<<distance[i]<<endl;
 64         }
 65     }
 66
 67 };
 68
 69 int main(){
 70     int n,m,a,b,start;
 71     cin>>n>>m>>start;
 72     Graph g(n);
 73     for(int i=0;i<m;i++){
 74         cin>>a>>b;
 75         g.insert(a,b);
 76     }
 77     g.calculate(start);
 78     g.print_dis();
 79 }
 80
 81
 82
 83
 84
 85
 86
 87 //迷宫中的英雄
 88 #include <iostream>
 89 #include <queue>
 90 #include <cstring>
 91 using namespace std;
 92
 93 int n,m,t,sx,sy,px,py;
 94
 95 struct step{
 96     int x, y, dis=0;
 97 };
 98
 99 char map[100][100];
100 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
101 int visited[100][100];
102
103 void bfs(){
104     queue<step> Q;
105     step cur,temp;
106     cur.x=sx;
107     cur.y=sy;
108     cur.dis=0;
109     Q.push(cur);
110     visited[sx][sy]=1;
111     while(!Q.empty()){
112         cur=Q.front();
113         Q.pop();
114
115         if(cur.dis>t){
116             break;
117         }
118
119         if(cur.x==px&&cur.y==py){
120             cout<<"YES"<<endl;
121             return;
122         }
123
124         for(int i=0;i<4;i++){
125             temp.x=cur.x+dir[i][0];
126             temp.y=cur.y+dir[i][1];
127             if(temp.x>=0 && temp.x<m && temp.y>=0 && temp.y<n && map[temp.x][temp.y]!=‘*‘ && visited[temp.x][temp.y]==0){
128                 temp.dis=cur.dis+1;
129                 Q.push(temp);
130                 visited[temp.x][temp.y]=1;
131             }
132         }
133     }
134     cout<<"NO"<<endl;
135 }
136
137
138 int main(){
139     while(cin>>n>>m>>t){
140         if(n==0&&m==0&&t==0){
141             break;
142         }
143         memset(map,0,sizeof(map));
144         memset(visited,0,sizeof(visited));
145         for(int i=0;i<m;i++){
146             for(int j=0;j<n;j++){
147                 cin>>map[i][j];
148                 if(map[i][j]==‘S‘){
149                     sx=i;
150                     sy=j;
151                 }
152                 if(map[i][j]==‘P‘){
153                     px=i;
154                     py=j;
155                 }
156             }
157         }
158         bfs();
159     }
160     return 0;
161 }
162
163
164
165
166
167
168
169 //bfs 解骑马走江湖
170 #include <iostream>
171 #include <queue>
172 #include <cstring>
173 using namespace std;
174
175 struct point{
176     int x,y,step;
177 };
178
179 char map[105][105];
180 bool visited[105][105];
181 int height,width,Xstart,Ystart,Xend,Yend;
182 int dir[8][2]={{-2,1},{-2,-1},{2,1},{2,-1},{-1,-2},{1,-2},{-1,2},{1,2}};
183 int horse_leg[8][2]={{-1,0},{-1,0},{1,0},{1,0},{0,-1},{0,-1},{0,1},{0,1}};
184
185
186 int bfs(queue<point> Q){
187     int Xblcok,Yblock;
188     int x=Xstart;
189     int y=Ystart;
190     Q.push(point{x,y,0});
191     visited[x][y]=1;
192     while(!Q.empty()){
193         point cur=Q.front();
194         if(cur.x==Xend&&cur.y==Yend){
195             return cur.step;
196         }
197         for(int i=0;i<8;i++){
198             x=cur.x+dir[i][0];
199             y=cur.y+dir[i][1];
200             Xblcok=cur.x+horse_leg[i][0];
201             Yblock=cur.y+horse_leg[i][1];
202             if(x>=0&&x<height&&y>=0&&y<width&&map[x][y]!=‘#‘&&map[Xblcok][Yblock]!=‘#‘&&!visited[x][y]){
203                 Q.push({x,y,cur.step+1});
204                 visited[x][y]=1;
205             }
206         }
207         Q.pop();
208     }
209     return -1;
210 }
211
212
213 int main(){
214     while(cin>>height>>width){
215         queue<point> Q;
216         memset(visited,0,sizeof(visited));
217         for(int i=0;i<height;i++){
218             for(int j=0;j<width;j++){
219                 cin>>map[i][j];
220                 if(map[i][j]==‘s‘){
221                     Xstart=i;
222                     Ystart=j;
223                 }
224                 if(map[i][j]==‘e‘){
225                     Xend=i;
226                     Yend=j;
227                 }
228             }
229         }
230         cout<<bfs(Q)<<endl;
231     }
232     return 0;
233 }
时间: 2024-11-09 06:26:51

bfs求最短路的几道例题的相关文章

UVa 816 (BFS求最短路)

/*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (const char *str, int c) ---BFS求最短路 --*/ #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h> #include<queue> #include<al

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是相连通的.(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住. /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */ #include <cstdio> #i

UVA 816 -- Abbott&#39;s Revenge(BFS求最短路)

 UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉点的方向(用NEWS表示不同方向)不同时, 允许出去的方向也不相同. 例如:1 2 WLF NR ER * 表示如果 进去时朝W(左), 可以 左转(L)或直行(F), 如果 朝N只能右转(R) 如果朝E也只能右转.* 表示这个点的描述结束啦! 输入有: 起点的坐标, 朝向, 终点的坐标.然后是各个

[codeforces-543B]bfs求最短路

题意:给一个边长为1的无向图,求删去最多的边使得从a到b距离<=f,从c到d距离<=g,a,b,c,d,f,g都是给定的,求最多删去的边数. 思路:反过来思考,用最少的边构造两条从a到b,从c到d的路径,使得它们满足题目中的条件.于是可以把这两条路径的相对位置分为两种情况,不相交和相交,对于不相交的情况答案就是两组距离之和,对于相交的情况,两条路径肯定共享一段连续路径,对于共享多段的情况可以把中间没共享的取较小值变成共享,得到的距离和不会更大,因此最优情况一定是一段连续的路径.于是可以枚举共享

UVa439 Knight Moves (BFS求最短路)

链接:http://acm.hust.edu.cn/vjudge/problem/19436分析:BFS跑一次最短路,状态转移有8个. 1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 6 struct Point { 7 char r, c; 8 Point(char r = ' ', char c = ' '): r(r), c(c) {}; 9

POJ3669(Meteor Shower)(bfs求最短路)

Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12642   Accepted: 3414 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they h

hdu 5876 Sparse Graph 无权图bfs求最短路

Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if

uva 816 BFS求最短路的经典问题……

一开始情况没有考虑周全,直接WA掉了, 然后用fgets()出现了WA,给改成scanf就AC了 题目不是很难,用心就好…… #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <cstdlib> #include <stack> #include <cctype

常用最短路优化算法及例题(附模板)——-SPFA和Dijkstra

常用最短路算法——-SPFA和Dijkstra及其优化 这篇文章将简单讲解两个最常用的最短路优化算法,需要读者有一定的图论基础. 首先从DIJKSTRA讲起.常规的dijkstra算法复杂度较高,为O(n^2),因为要花大量时间来找当前已知的距顶点距离最小的值,所以用优先队列(值小的先出队列)来优化,可大大优化时间复杂度.STL中优先队列的操作单次复杂度为O(logN),所以经过优先队列优化的dijkstra时间复杂度会降到O(N*logN); 以下为核心部分代码: 1 struct pack{