Solution
经典bfs,所有的点到店的最短距离
其中一开始队列的长度为店的数目
一个点可能有多个订单
关于数据大小:
1.
1000*(1000*1000)*2000=2,0000,0000,0000
订餐量*客户的数量*距离
总数用__int64
2.
1000*(1000*1000)=10,0000,0000
订餐量*客户的数量
一个数总数用long
Code:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 #define maxn 1000 5 6 /* 7 1. 8 1000*(1000*1000)*2000=2,0000,0000,0000 9 订餐量*客户的数量*距离 10 总数用__int64 11 2. 12 1000*(1000*1000)=10,0000,0000 13 订餐量*客户的数量 14 一个数总数用long 15 */ 16 17 struct node 18 { 19 long x,y; 20 }; 21 22 long dx[4]={-1,0,0,1},dy[4]={0,-1,1,0}; 23 long amount[maxn+1][maxn+1],dist[maxn+1][maxn+1]; 24 __int64 ans=0; 25 struct node que[maxn*maxn+1]; 26 27 int main() 28 { 29 long head,tail,n,m,k,d,s,i,j,x,y,xx,yy; 30 scanf("%ld%ld%ld%ld",&n,&m,&k,&d); 31 head=0; 32 tail=0; 33 for (i=1;i<=n;i++) 34 for (j=1;j<=n;j++) 35 dist[i][j]=-2; 36 for (i=1;i<=m;i++) 37 { 38 scanf("%ld%ld",&x,&y); 39 dist[x][y]=0; 40 tail++; 41 que[tail].x=x; 42 que[tail].y=y; 43 } 44 for (i=1;i<=n;i++) 45 for (j=1;j<=n;j++) 46 amount[i][j]=0; 47 for (i=1;i<=k;i++) 48 { 49 scanf("%ld%ld%ld",&x,&y,&s); 50 amount[x][y]+=s; 51 } 52 for (i=1;i<=d;i++) 53 { 54 scanf("%ld%ld",&x,&y); 55 dist[x][y]=-1; 56 } 57 while (head<tail) 58 { 59 head++; 60 for (i=0;i<4;i++) 61 { 62 xx=que[head].x+dx[i]; 63 yy=que[head].y+dy[i]; 64 if (dist[xx][yy]==-2) 65 { 66 dist[xx][yy]=dist[que[head].x][que[head].y]+1; 67 tail++; 68 que[tail].x=xx; 69 que[tail].y=yy; 70 } 71 } 72 } 73 for (i=1;i<=n;i++) 74 for (j=1;j<=n;j++) 75 ans+=amount[i][j]*dist[i][j]; 76 printf("%I64d ",ans); 77 return 0; 78 }