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;
}
posted @ 2025-02-21 11:47  Annaprincess  阅读(6)  评论(0)    收藏  举报