优先队列+BFS
  • 板块学术版
  • 楼主MARCUSE
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/7/29 21:35
  • 上次更新2023/10/27 17:47:14
查看原帖
优先队列+BFS
199051
MARCUSE楼主2022/7/29 21:35

有点不太能理解

网上许多关于优先队列+BFS的博客,但是在进队时就打上了vis标记

不会挂吗?

还是说走迷宫的问题和最短路的情况不一样?

以下面为例:(不打出处了,不会被喷吧

#include<bits/stdc++.h>
using namespace std;
int n,m,k,mixn;
int vis[110][110];
int Map[110][110]; 
int dir[4][2]={-1,0,1,0,0,-1,0,1};
struct fun{
	int x,y;
	int t;
	friend bool operator<(fun a,fun b){
		return a.t>b.t;//相反的     时间短的在前面
	}
}great;
void bfs(){
	priority_queue<fun> q;
	great.x=0;
	great.y=0;
	great.t=Map[0][0];
	vis[0][0]=1;
	q.push(great);
	mixn=0x7fffffff;
	while(q.size()){
		fun num=q.top();
		q.pop();
		if(num.x==n-1&&num.y==m-1){
			mixn=num.t;
		}
		for(int i=0;i<4;i++){
			int xx=num.x+dir[i][0];
			int yy=num.y+dir[i][1];
			if(xx<0||xx>=n||yy<0||yy>=m||num.t+Map[xx][yy]>mixn){
				continue;
			}
			if(vis[xx][yy]==0){ 
				vis[xx][yy]=1; //进队时就挂标记?不会挂吗 
				great.x=xx;
				great.y=yy;
				great.t=num.t+Map[xx][yy];
				q.push(great);
			}
		}
	}
}
int main(){
	while(scanf("%d %d",&n,&m)!=EOF){
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				scanf("%d",&Map[i][j]);
			}
		}
		bfs();
		printf("%d\n",mixn);
	}
    return 0;
}

2022/7/29 21:35
加载中...