| 试题编号: | 201409-4 |
| 试题名称: | 最优配餐 |
| 时间限制: | 1.0s |
| 内存限制: | 256.0MB |
| 问题描述: |
问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。 输入格式 输入的第一行包含四个整数n, m, k, d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。 输出格式 输出一个整数,表示最优送餐方式下所需要花费的成本。 样例输入 10 2 3 3 样例输出 29 评测用例规模与约定 前30%的评测用例满足:1<=n <=20。 |
说明:把配餐点全部放进队列中,开始bfs。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1005;
ll ans[MAX_N][MAX_N];
int cg[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool vst[MAX_N][MAX_N],a[MAX_N][MAX_N];
struct po{
int x,y;
ll num;
po(int xx,int yy,ll ff){
x=xx;
y=yy;
num=ff;
}
};
int n,m,k,d;
vector<po>ve;
queue<po>q;
void bfs(){
while(!q.empty()){
po now=q.front();
q.pop();
for(int i=0;i<=3;i++){
int xx=now.x+cg[i][0];
int yy=now.y+cg[i][1];
ll ff=now.num;
if(yy<1||yy>n||xx<1||xx>n||vst[xx][yy]||a[xx][yy])continue;
vst[xx][yy]=1;
ans[xx][yy]=ff+1;
q.push(po(xx,yy,ff+1));
}
}
}
int main(){
cin>>n>>m>>k>>d;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
q.push(po(x,y,0));
vst[x][y]=true;
}
for(int i=1;i<=k;i++){
int x,y;
ll num;
cin>>x>>y>>num;
ve.push_back(po(x,y,num));
}
for(int i=1;i<=d;i++){
int x,y;
cin>>x>>y;
a[x][y]=1;
}
bfs();
ll s=0;
for(auto it:ve){
s+=ans[it.x][it.y]*it.num;
}
cout<<s<<endl;
return 0;
}