题目大意:
栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。
栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。
方格图中的线表示可以行走的道路,相邻两个格点的距离为1。栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。
送餐的主要成本体现在路上所花的时间,每一份餐每走一个单位的距离需要花费1块钱。每个客户的需求都可以由栋栋的任意分店配送,每个分店没有配送总量的限制。
现在你得到了栋栋的客户的需求,请问在最优的送餐方式下,送这些餐需要花费多大的成本。
一眼看过去就是bfs求最短路 多源点的只要在开始的时候把所有的源点加进队列就可以了
代码:
#include <iostream> #include <queue> #include <map> using namespace std; const int N= 1e6+10; int g[1010][1010],dis[1010][1010],vi[1010][1010]; pair<int,int> p[N]; map<pair<int,int>,int> mp; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int main(){ int n,m,k,d; cin>>n>>m>>k>>d; queue<pair<int,int>> q; for(int i=0;i<m;i++){ int x,y; cin>>x>>y; g[x][y]=1; vi[x][y]=1; q.push(make_pair(x,y)); } for(int i=0;i<k;i++){ int x,y,c; cin>>x>>y>>c; p[i].first=x; p[i].second=y; if(mp[make_pair(x,y)]){ mp[make_pair(x,y)]+=c; } else mp[make_pair(x,y)]+=c; } for(int i=0;i<d;i++){ int x,y; cin>>x>>y; g[x][y]=2; } while(q.size()){ pair<int,int> t=q.front(); q.pop(); int x=t.first; int y=t.second; for(int j=0;j<4;j++){ int nx=x+dx[j]; int ny=y+dy[j]; if(nx>=1&&nx<=n&&ny>=1&&ny<=n){ if(vi[nx][ny])continue; if(g[nx][ny]==2)continue; dis[nx][ny]=dis[x][y]+1; vi[nx][ny]=1; q.push(make_pair(nx,ny)); } } } long long res=0; for(int i=0;i<k;i++){ res+=(dis[p[i].first][p[i].second])*1ll*(mp[make_pair(p[i].first,p[i].second)]); } cout<<res<<endl; }
原文:https://www.cnblogs.com/kstranger/p/13543938.html