码迷,mamicode.com
首页 > 其他好文 > 详细

红衣男孩(bfs)

时间:2017-08-26 22:51:41      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:one   clu   c++   image   gif   href   div   最短路   logs   

题目链接: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 }
View Code

 

红衣男孩(bfs)

标签:one   clu   c++   image   gif   href   div   最短路   logs   

原文地址:http://www.cnblogs.com/yijiull/p/7436544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!