试题编号: | 201409-4 |
试题名称: | 最优配餐 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。 输入格式 输入的第一行包含四个整数n, m, k, d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。 输出格式 输出一个整数,表示最优送餐方式下所需要花费的成本。 样例输入 10 2 3 3 样例输出 29 评测用例规模与约定 前30%的评测用例满足:1<=n <=20。 |
思路:bfs,注意结果超过int
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int dir[4][2]= {1,0,0,1,-1,0,0,-1};
const double eps = 1e-6;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int N = 1e3+5;
struct Node {
int x,y,cost;
};
int w[N][N];
bool vis[N][N];
queue<Node>que;
int n,m,k,d;
ll bfs() {
ll sum=0,cnt=0;
while(!que.empty()) {
Node now=que.front();
que.pop();
for(int i=0; i<4; i++) {
int x=now.x+dir[i][0];
int y=now.y+dir[i][1];
int cost=now.cost+1;
if(!vis[x][y]&&x>0&&x<=n&&y>0&&y<=n) {
vis[x][y]=1;
if(w[x][y]!=0) {
sum+=1LL*cost*w[x][y];
if(++cnt==k) return sum;
}
que.push({x,y,cost});
}
}
}
}
int main() {
scanf("%d%d%d%d",&n,&m,&k,&d);
for(int i=0; i<m; i++) {
int x,y;
scanf("%d%d",&x,&y);
vis[x][y]=1;
que.push({x,y,0});
}
for(int i=0; i<k; i++) {
int x,y,p;
scanf("%d%d%d",&x,&y,&p);
w[x][y]=p;
}
for(int i=0; i<d; i++) {
int x,y;
scanf("%d%d",&x,&y);
vis[x][y]=1;
}
printf("%lld\n",bfs());
return 0;
}