csp20140904最优配餐_Solution
2024-10-14 03:54:26
Solution
经典bfs,所有的点到店的最短距离
其中一开始队列的长度为店的数目
一个点可能有多个订单
关于数据大小:
1.
1000*(1000*1000)*2000=2,0000,0000,0000
订餐量*客户的数量*距离
总数用__int64
2.
1000*(1000*1000)=10,0000,0000
订餐量*客户的数量
一个数总数用long
Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxn 1000 /*
1.
1000*(1000*1000)*2000=2,0000,0000,0000
订餐量*客户的数量*距离
总数用__int64
2.
1000*(1000*1000)=10,0000,0000
订餐量*客户的数量
一个数总数用long
*/ struct node
{
long x,y;
}; long dx[]={-,,,},dy[]={,-,,};
long amount[maxn+][maxn+],dist[maxn+][maxn+];
__int64 ans=;
struct node que[maxn*maxn+]; int main()
{
long head,tail,n,m,k,d,s,i,j,x,y,xx,yy;
scanf("%ld%ld%ld%ld",&n,&m,&k,&d);
head=;
tail=;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
dist[i][j]=-;
for (i=;i<=m;i++)
{
scanf("%ld%ld",&x,&y);
dist[x][y]=;
tail++;
que[tail].x=x;
que[tail].y=y;
}
for (i=;i<=n;i++)
for (j=;j<=n;j++)
amount[i][j]=;
for (i=;i<=k;i++)
{
scanf("%ld%ld%ld",&x,&y,&s);
amount[x][y]+=s;
}
for (i=;i<=d;i++)
{
scanf("%ld%ld",&x,&y);
dist[x][y]=-;
}
while (head<tail)
{
head++;
for (i=;i<;i++)
{
xx=que[head].x+dx[i];
yy=que[head].y+dy[i];
if (dist[xx][yy]==-)
{
dist[xx][yy]=dist[que[head].x][que[head].y]+;
tail++;
que[tail].x=xx;
que[tail].y=yy;
}
}
}
for (i=;i<=n;i++)
for (j=;j<=n;j++)
ans+=amount[i][j]*dist[i][j];
printf("%I64d\n",ans);
return ;
}
最新文章
- MySQL练习-employees数据库(一)
- 利用angular结合translate为项目实现国际化
- IntelliJ IDEA 12 与 Tomcat7 配置
- redis主从 以及认证配置
- Knockout 新版应用开发教程之Observable Arrays
- C# Window Service详解
- 转载:struts标签<;s:date>;的使用
- HDU 1248 寒冰王座(全然背包:入门题)
- mysql 时间字段的一些问题
- Django框架初识
- angular采坑记录
- JavaI/O体系详解
- OpenLayers3中wfs的属性查询
- Flask的上下文源码剖析
- 2019年 Gratner数据分析平台对比 - PowerBI大幅领先
- Java内存管理之类似-Xms、-Xmx 这些参数的含义
- cf789d 图论计数,自环闭环
- [Android实例] Android之断点续传下载
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)
- FFMpeg笔记(二) 使用FFmpeg对视频进行编解码的一般流程