有点不太能理解
网上许多关于优先队列+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;
}