关于本蒟蒻初学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 }