201409-4 最优配餐 100分 250ms

点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
在这里插入图片描述
考点:多源最短距离
易错点:int溢出 起始位置不为0

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct P{
	int x,y,w;//坐标x,y到最近分店的距离w
	P(const int&x,const int&y,const int&w):x(x),y(y),w(w){}
};
unsigned long long ans=0UL,K[1001][1001];//K存放客户的餐量
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int n,m,k,d;
	cin>>n>>m>>k>>d,ans=0UL;
	char visit[1001][1001],V=char(0),U=char(1);
	queue<P> q;
	memset(K,0,sizeof(K));
	memset(visit,0,sizeof(visit));
	for(int i=0,x,y;i<m;++i){
		cin>>x>>y;
		q.push(P(x,y,0));/从分店开始依次查找距离为w+1的点
		visit[x][y]=U;
	}
	for(int i=0,x,y,c;i<k;++i){
		cin>>x>>y>>c;
		K[x][y]+=c;
	}
	for(int i=0,x,y;i<d;++i){
		cin>>x>>y;
		visit[x][y]=U;
	}
	while(!q.empty()){
		P& p=q.front();
		int _w=p.w+1,&x=p.x,&y=p.y,lx=x-1,rx=x+1,ly=y-1,ry=y+1;
		if(K[x][y]>0UL)ans+=K[x][y]*p.w;//该点为客户位置 计算最短距离*餐量 
		if(lx>0&&visit[lx][y]==V) visit[lx][y]=U,q.push(P(lx,y,_w));
		if(rx<=n&&visit[rx][y]==V) visit[rx][y]=U,q.push(P(rx,y,_w));
		if(ly>0&&visit[x][ly]==V) visit[x][ly]=U,q.push(P(x,ly,_w));
		if(ry<=n&&visit[x][ry]==V) visit[x][ry]=U,q.push(P(x,ry,_w));
		q.pop();
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值