关于本蒟蒻初学BFS
在寒假集训中的某一节课中(划水太严重忘了哪一节)看到了穆学长做的程序,首先惊叹于学长的能力(YYDS!)其次对于展示的动图能够生动形象的展示出深度优先遍历和广度优先遍历的区别。
本文只浅谈BFS
类似于扫荡的感觉(不放过一个!)
如同我的世界里向起始点倒一盆水的感觉
BFS传达的海王精神 (简直是吾辈楷模!)
BFS是以空间换时间,以n2的空间复杂度存进下一步能到达的所有点——导致的结果是能够找到起点到重点的最近距离,但是不能遍历所有的结果
顺便一句话
BFS只适用于边权相等的图中求最短距离
经典例题
1 #include <bits/stdc++.h> 2 #define endl '\n' 3 #define x first 4 #define y second 5 #define Tang ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 6 7 using namespace std; 8 9 const int N=105; 10 const int INF=0x3f3f3f3f; 11 const int mod=1e9+7; 12 13 int n,m; 14 int d[N][N]; //表距离 15 int g[N][N]; //存数值 16 17 typedef pair<int, int> PII; 18 int dx[4]={-1,0,1,0}; 19 int dy[4]={0,1,0,-1}; 20 21 int bfs() 22 { 23 24 queue<PII> q; 25 q.push({0,0}); 26 27 memset(d, -1, sizeof d); 28 d[0][0]=0; 29 30 while(q.size()) //队列不为空 31 { 32 33 PII t=q.front(); //取出队首元素 34 q.pop(); //删去 35 36 for(int i=0;i<4;i++) //遍历到上下左右四个方向 37 { 38 int a=t.x+dx[i],b=t.y+dy[i]; 39 if(a>=0 && a<n && b>=0 && b<m && g[a][b]==0 && d[a][b]==-1) 40 { 41 d[a][b]=d[t.x][t.y]+1; 42 q.push({a,b}); //此时出现新的队首元素 43 } 44 } 45 } 46 return d[n-1][m-1]; //返回右下角的值 47 48 } 49 50 void solve() 51 { 52 53 cin >> n >> m; 54 55 for(int i=0;i<n;i++) 56 for(int j=0;j<m;j++) 57 cin >> g[i][j]; 58 59 cout << bfs() << endl; 60 61 62 } 63 64 signed main() 65 { 66 Tang 67 int T=1; 68 //cin >> T; 69 while(T--) 70 solve(); 71 72 return 0; 73 74 } 75
用邻接矩阵来进行BFS
数组模拟队列 (用数组模拟链表中的插入和删除等操作)
1 #include <bits/stdc++.h> 2 #define endl '\n' 3 #define x first 4 #define y second 5 #define int long long 6 #define Tang ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 7 8 using namespace std; 9 10 const int N=1e5+10; 11 const int INF=0x3f3f3f3f; 12 const int mod=1e9+7; 13 14 int n,m; 15 int h[N],e[N],ne[N],idx=0; 16 //h是链表头,e数组存数值,ne存下一个数的地址 17 //idx为不重复的计数单位 18 //采用头插法(便于李姐) 19 int d[N]; 20 21 void add(int a,int b) 22 { 23 e[idx]=b; 24 ne[idx]=h[a]; 25 h[a]=idx++; 26 } 27 28 int bfs() 29 { 30 31 memset(d,-1,sizeof d); 32 33 queue<int> q; 34 d[1]=0; 35 q.push(1); //要搜索一个点的话就放那个点,模板里是求1到n的距离 36 37 while(q.size()) //当队列不为空时 38 { 39 int t=q.front(); //取队首元素 40 q.pop(); 41 for(int i=h[t];i!=-1;i=ne[i]) //遍历这一条线上所有的点 42 { 43 int k=e[i]; 44 if(d[k]==-1) //如果还没有被走过就更新(上一个距离+1) 45 { 46 d[k]=d[t]+1; 47 q.push(k); //放进去判断是否有捷径(1-2-3-4 || 1-4) 48 } 49 } 50 } 51 return d[n]; //返回n号值的距离 52 53 } 54 55 void solve() 56 { 57 58 cin >> n >> m; 59 memset(h,-1,sizeof h); 60 61 for(int i=0;i<m;i++) 62 { 63 64 int a,b; 65 cin >> a >> b; 66 67 add(a,b); 68 69 } 70 cout << bfs() << endl; 71 } 72 73 signed main() 74 { 75 Tang 76 int T=1; 77 //cin >> T; 78 while(T--) 79 solve(); 80 81 return 0; 82 83 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)