原题链接
解题思路
将所有的店家同时入队列。BFS,谁先到算谁的
代码
#include <bits/stdc++.h>
using namespace std;
int cnt[1010][1010]={0};//用于标记每个位置的送餐量
bool visited[1010][1010];
long long ans =0;
struct node{
int x,y,t;
node(int xx,int yy,int tt=0):x(xx),y(yy),t(tt){}
};
int n,m,k,d;
int dir[4][2] ={{-1,0},{1,0},{0,1},{0,-1}};
int main(){
scanf("%d%d%d%d",&n,&m,&k,&d);
queue<node> q;//店铺
while(m--){
int a,b;
scanf("%d%d",&a,&b);
q.push(node{a,b});
visited[a][b] = true;
}
while(k--){
int a,c,num;
scanf("%d%d%d",&a,&c,&num);
cnt[a][c] += num;//统计某点需要的订餐数
}
while(d--){
int a,b;
scanf("%d%d",&a,&b);
cnt[a][b] = -1;//标记为不能经过
}
while(!q.empty()){
node v = q.front();
q.pop();
if(cnt[v.x][v.y] > 0){
ans += (long long)cnt[v.x][v.y]*v.t;//更新最小花费的时间
}
for(int i=0;i<4;i++){
int tx = v.x+dir[i][0];
int ty = v.y+dir[i][1];
//可访问且未访问
if(tx>0&&tx<=n&&ty>0&&ty<=n && cnt[tx][ty]>=0 &&!visited[tx][ty]){
q.push(node{tx,ty,v.t+1});
visited[tx][ty] = true;
}
}
}
cout<<ans;
return 0;
}