点击前往试题目录: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;
}