积水的城市 hiho[Offer收割]编程练习赛4
题目2 : 积水的城市
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
如下图所示,某市市区由M条南北向的大街和N条东西向的道路组成。其中由北向南第i条路和第i+1条路之间的距离是Bi (1 <= i < N),由西向东第i条街和第i+1条街之间的距离是Ai (1 <= i < M)。
小Ho现在位于第x条路和第y条街的交叉口,他的目的地是第p条路和第q条街的交叉口。由于连日降雨,城市中有K个交叉口积水太深不能通行。小Ho想知道到达目的地的最短路径的长度是多少。
输入
第一行包含两个整数N和M。(1 <= N, M <= 500)
第二行包含N-1个整数, B1, B2, B3, ... BN-1。(1 <= Bi <= 100)
第三行包含M-1个整数, A1, A2, A3, ... AM-1。(1 <= Ai <= 100)
第四行包含一个整数K,表示积水的交叉口的数目。 (0 <= K <= 30)
以下K行每行包含2个整数,X和Y,表示第X条路和第Y条街的交叉口积水。(1 <= X <= N, 1 <= Y <= M)
第K+5行包含一个整数Q,表示询问的数目。 (1 <= Q <= 10)
以下Q行每行包含4个整数x, y, p, q,表示小Ho的起止点。起止点保证不在积水的交叉口处。 (1 <= x, p <= N, 1 <= y, q <= M)
输出
对于每组询问,输出最短路的长度。如果小Ho不能到达目的地,输出-1。
- 样例输入
-
4 5 2 4 1 3 3 3 2 3 1 3 2 3 3 2 1 1 2 2 4
- 样例输出
-
24
只能说刷题真好,之前模糊的知识,坐上几道题哦了。以后多刷题,专注点。少走神、、、
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <queue> using namespace std; const int maxn = 200010; typedef long long ll; const int inf =0x3f3f3f3f; int maze[505][505],d[505][505],nn[501],b[505],n,m; struct node{ int d,x,y; //node (int dd,int xx,int yy):x(xx), y(yy), d(dd) {} bool operator < (const node& a) const { return d>a.d; } }; int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}; int dis(int x,int y,int i){ if(i==0)return b[y]; if(i==1)return nn[x]; if(i==2)return b[y-1]; return nn[x-1]; } void bfs(int s,int t){ priority_queue<node> que; que.push(node{0,s,t}); d[s][t]=0; while(!que.empty()){ node q= que.top(); que.pop(); int x=q.x,y=q.y,dd=q.d; //printf("%d %d %d \n",x,y,dd); if(d[x][y]!=dd) continue; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; //printf("%d %d\n",nx,ny); if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!maze[nx][ny]&&(d[nx][ny]>d[x][y]+dis(x,y,i))){ d[nx][ny]=d[x][y]+dis(x,y,i); que.push(node{d[nx][ny],nx,ny}); //printf("%d %d %d \n",nx,ny,d[nx][ny]); } } } } int main() { //freopen("data.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<n;i++) scanf("%d",nn+i); for(int i=1;i<m;i++) scanf("%d",b+i); int q,k,x,y; scanf("%d",&k); for(int i=0;i<k;i++){ scanf("%d%d",&x,&y); maze[x][y]=1; } scanf("%d",&q); while(q--){ memset(d,0x3f,sizeof(d)); int x,y,s,t; scanf("%d%d%d%d",&x,&y,&s,&t); bfs(x,y); if(d[s][t]==inf) printf("-1\n"); else printf("%d\n",d[s][t]); } }