E - Emptying the Baltic Kattis - emptyingbaltic (dijkstra堆优化)

题目链接:

E - Emptying the Baltic

 Kattis - emptyingbaltic 

题目大意:n*m的地图, 每个格子有一个海拔高度, 当海拔<0的时候有水。 现在在(x, y)最深处放一个抽水机, 问最多能抽多少水,周围8个方向的水会流过来。

具体思路:对于每一个海拔小于0的点,判断这个点周围有水的最低高度。然后将这些高度加起来就可以了。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 500+100;
 6 int n,m;
 7 int a[maxn][maxn];
 8 int vis[maxn][maxn];
 9 int f[2][8]= {{1,-1,0,0,1,-1,1,-1},
10     {0,0,1,-1,-1,1,1,-1}
11 };
12 struct node
13 {
14     int x,y,dep;
15     node() {}
16     node(int xx,int yy,int zz)
17     {
18         x=xx;
19         y=yy;
20         dep=zz;
21     }
22     bool friend operator < (node t1,node t2)
23     {
24         return t1.dep>t2.dep;
25     }
26 };
27 bool judge(int x,int y)
28 {
29     if(x>=1&&x<=n&&y>=1&&y<=m)
30         return true;
31     return false;
32 }
33 ll spfa(int x,int y)
34 {
35     priority_queue<node>q;
36     q.push(node(x,y,a[x][y]));
37     vis[x][y]=1;
38     ll ans=fabs(a[x][y]);
39     while(!q.empty())
40     {
41         node top=q.top();
42         q.pop();
43         for(int i=0; i<8; i++)
44         {
45             int tx=top.x+f[0][i];
46             int ty=top.y+f[1][i];
47             if(judge(tx,ty)&&vis[tx][ty]==0&&a[tx][ty]<0)
48             {
49                 vis[tx][ty]=1;
50                 int tmp=max(a[tx][ty],top.dep);
51                 ans+=(-tmp);
52                 q.push(node(tx,ty,tmp));
53             }
54         }
55     }
56     return ans;
57 }
58 int main()
59 {
60     scanf("%d %d",&n,&m);
61     for(int i=1; i<=n; i++)
62     {
63         for(int j=1; j<=m; j++)
64         {
65             scanf("%d",&a[i][j]);
66         }
67     }
68     int x,y;
69     scanf("%d %d",&x,&y);
70    ll ans=spfa(x,y);
71     printf("%lld\n",ans);
72     return 0;
73 }

 

posted @ 2019-04-03 18:23  Let_Life_Stop  阅读(318)  评论(0编辑  收藏  举报