题目链接:here
算是将近一年前的题了=_=
终于知道自己之前一直错在哪了。。。
跟普通的bfs求最短路不一样的是,没有限制每个格子只能走一次~
这个题就像是堆优化的dijkstra一样~
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=1010; 4 const int inf=0x3f3f3f3f; 5 int dir[4][2]={1,0,0,1,-1,0,0,-1}; 6 int p[maxn][maxn]; 7 int d[maxn][maxn]; 8 int money[maxn][maxn]; 9 int n,m; 10 int sx,sy,ex,ey; 11 struct Node{ 12 int x,y; 13 int my,st; 14 }a,b; 15 int my,st; 16 void bfs(){ 17 queue<Node> q; 18 memset(money,0,sizeof(money)); 19 memset(d,inf,sizeof(d)); 20 d[sx][sy]=0; 21 money[sx][sy]=p[sx][sy]; 22 a.my=p[sx][sy]; 23 a.st=0; 24 a.x=sx;a.y=sy; 25 q.push(a); 26 while(!q.empty()){ 27 a=q.front(); 28 q.pop(); 29 if(a.st>st) break; 30 if(a.x==ex&&a.y==ey){ 31 if(a.st<st||a.st==st&&a.my>my){ 32 st=a.st; 33 my=a.my; 34 } 35 continue; 36 } 37 if(d[a.x][a.y]<a.st||d[a.x][a.y]==a.st&&money[a.x][a.y]>a.my) continue; 38 for(int i=0;i<4;i++){ 39 b.x=a.x+dir[i][0]; 40 b.y=a.y+dir[i][1]; 41 if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&p[b.x][b.y]!=-1){ 42 b.my=a.my+p[b.x][b.y]; 43 b.st=a.st+1; 44 if(d[b.x][b.y]<b.st||d[b.x][b.y]==b.st&&money[b.x][b.y]>=b.my) continue; //只漏了一个等号就MLE=_= 45 d[b.x][b.y]=b.st; 46 money[b.x][b.y]=b.my; 47 q.push(b); 48 } 49 } 50 } 51 } 52 int main(){ 53 int t; 54 scanf("%d",&t); 55 while(t--){ 56 scanf("%d%d",&n,&m); 57 scanf("%d%d%d%d",&sx,&sy,&ex,&ey); 58 sx--;sy--;ex--;ey--; 59 for(int i=0;i<n;i++) 60 for(int j=0;j<m;j++) 61 scanf("%d",&p[i][j]); 62 my=-1; 63 st=inf; 64 bfs(); 65 printf("%d\n",my); 66 } 67 }
时间: 2024-10-24 06:36:19