bfs
bfs宽搜
1.走迷宫

#include<bits/stdc++.h>
using namespace std;
int g[110][110];//存图
int d[110][110];//d[i][j]存放的为从起点到(i,j)这个点的距离
int n,m;
//针对东南西北走的问题一定要写变化方向向量dx,dy且对应
int dx[4]={-1,1,0,0};//行。上下左右
int dy[4]={0,0,-1,1};//列
int bfs(){
queue<pair<int,int> >q;
q.push({1,1});
while(!q.empty()){
pair<int,int>a=q.front();
int x=a.first;
int y=a.second;
q.pop();
//队头四个方向(前后左右)
for(int i=0;i<4;i++){
int bx=x+dx[i];
int by=y+dy[i];
if(bx<1||bx>n||by<1||by>m||d[bx][by]||g[bx][by]==1){
continue;
}
d[bx][by]=d[x][y]+1;//距离
q.push({bx,by});
}
}
return d[n][m];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
cout<<bfs();
return 0;
}
要注意:
bx<1||bx>n||by<1||by>m越界
||d[bx][by]该点已经经过,因为求得是最短路所以避免往回走(bfs也要记录是否访问过防止重复搜索,只是不需要像dfs一样对现场恢复因为他用入队出队控制)
||g[bx][by]==1图中格子里是1不可以通过
最短路问题一般用bfs,因为时间复杂度小
2.图中点的层次(最短路w=1问题)

//bfs计算权重为1的最短路问题
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int e[N];
int h[N];
int ne[N];
int idx;
int n,m;
int d[N];//d[i]表示起点1到i的距离
//邻接表存图
void add(int a,int b) {
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
//bfs
int bfs() {
queue<int>q;
q.push(1);
memset(d,-1,sizeof(d));//为处理到不了该点输出-1
d[1]=0;//1到1距离为0
while(!q.empty()){
int a=q.front();//队头
q.pop();
//与队头相邻的点
for(int i=h[a];i!=-1;i=ne[i]) {
int j=e[i];
if(d[j]!=-1)continue;//防止走回头路
d[j]=d[a]+1;
q.push(j);
}
}
return d[n];
}
int main(){
memset(h,-1,sizeof(h));
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;//有向图,所以只需要存指定的一边方向
add(a,b);
}
cout<<bfs();
return 0;
}

浙公网安备 33010602011771号