问题描述
试题编号: | 201409-4 |
试题名称: | 最优配餐 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。 输入格式 输入的第一行包含四个整数n, m, k, d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。 输出格式 输出一个整数,表示最优送餐方式下所需要花费的成本。 样例输入 10 2 3 3 样例输出 29 评测用例规模与约定 前30%的评测用例满足:1<=n <=20。 |
//多源最短路径,BFs找到的便是最短的
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N =1005;
int n,m,k,d;
struct Node
{
int x,y,s;//位置(x,y),步长s
Node(){
x=0;
y=0;
s=0;
}
Node(int x,int y,int s):x(x),y(y),s(s)
{
}
};
int dis[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int arr[N][N]={0};
int vis[N][N]={0};
queue<Node> q;
long long ans=0;
bool isf(int x,int y)
{
if(x<1||y<1||x>n||y>n)
{
return false;
}
return true;
}
void bfs()
{
while(!q.empty())
{
Node t=q.front();
q.pop();
int cx,cy,cs;
cx=t.x;cy=t.y;cs=t.s;
ans+=arr[cx][cy]*cs;
for(int i=0;i<4;i++)
{
int nx=cx+dis[i][0];
int ny=cy+dis[i][1];
int ns=cs+1;
if(!isf(nx,ny)||arr[nx][ny]==-1)
{
continue;
}
if(!vis[nx][ny])
{
vis[nx][ny]=1;
q.push(Node(nx,ny,ns));
}
}
}
}
int main(int argc, char** argv)
{
cin>>n>>m>>k>>d;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
q.push(Node(x,y,0));
vis[x][y]=1;
}
for(int i=0;i<k;i++)
{
int x,y,z;
cin>>x>>y>>z;
arr[x][y]+=z;
}
for(int i=0;i<d;i++)
{
int x,y;
cin>>x>>y;
arr[x][y]=-1;
}
bfs();
cout<<ans<<endl;
return 0;
}