题目描述: 最优配餐 

时间限制: 1.0s 
内存限制: 256.0MB 
问题描述: 问题描述
  栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。
  栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。
  方格图中的线表示可以行走的道路,相邻两个格点的距离为1。栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。

  送餐的主要成本体现在路上所花的时间,每一份餐每走一个单位的距离需要花费1块钱。每个客户的需求都可以由栋栋的任意分店配送,每个分店没有配送总量的限制。
  现在你得到了栋栋的客户的需求,请问在最优的送餐方式下,送这些餐需要花费多大的成本。

输入 

输入的第一行包含四个整数n, m, k, d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。
  接下来m行,每行两个整数xi, yi,表示栋栋的一个分店在方格图中的横坐标和纵坐标。
  接下来k行,每行三个整数xi, yi, ci,分别表示每个客户在方格图中的横坐标、纵坐标和订餐的量。(注意,可能有多个客户在方格图中的同一个位置)
  接下来d行,每行两个整数,分别表示每个不能经过的点的横坐标和纵坐标。

输出

  输出一个整数,表示最优送餐方式下所需要花费的成本。

样例输入

10 2 3 3
1 1
8 8
1 5 1
2 3 3
6 7 2
1 2
2 2
6 8

样例输出

29
评测用例规模与约定
  前30%的评测用例满足:1<=n <=20。
  前60%的评测用例满足:1<=n<=100。

  所有评测用例都满足:1<=n<=1000,1<=m, k, d<=n^2。可能有多个客户在同一个格点上。每个客户的订餐量不超过1000,每个客户所需要的餐都能被送到。 

思路

本质是算从给定多个起点到目标点的距离,算距离的话使用DFS或者是BFS都可以,但是如果是多起点的话最好用BFS,因为如果用DFS需要从不同起点开始遍历多次,时间消耗较大。

本题的总结

1. 算不同起点到终点的距离最好用BFS

2. 按照距离排序使用优先队列,重写排序函数

3. 坐标统一用现实坐标或者统一用虚拟坐标(x-1,y-1)

  1. // 最优配餐.cpp : 定义控制台应用程序的入口点。
  2.  
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <cstring>
  6. #include <queue>
  7. using
    namespace std;
  8.  
  9. const
    int MAX = 1000;
  10. //标记数组、地图、订餐和订餐数量
  11. int n, m, k, d, x, y, c, vis[MAX][MAX], map[MAX][MAX], num[MAX][MAX];
  12. int dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
  13. long
    long ans;
  14. struct Node
  15. {
  16.    int x, y, step;
  17.    Node(int xx, int yy, int ss)
  18.    {
  19.       x = xx; y = yy; step = ss;
  20.    }
  21.    //从大到小 重载小于号
  22.    friend bool
    operator < (Node a, Node b)
  23.    {
  24.       return a.step > b.step;
  25.    }
  26. };
  27. priority_queue<Node> q;
  28.  
  29. void BFS()
  30. {
  31.    while (!q.empty())
  32.    {
  33.       //mark
  34.       Node now = q.top();
  35.       q.pop();
  36.  
  37.       //cout << "now.x:" << now.x << "\t now.y:" << now.y << "\t now.step:" << now.step << endl;
  38.  
  39.       //check
  40.       if (map[now.x][now.y] == 2)//订餐客户
  41.          ans += now.step * num[now.x][now.y];
  42.  
  43.       //search next node
  44.       for (int i = 0; i < 4; i++)
  45.       {
  46.          x = now.x + dir[i][0];
  47.          y = now.y + dir[i][1];
  48.          //cout << "x:" << x << "\ty:" << y << "\tvis:" << vis[x][y] << "\tmap:" << map[x][y] << endl;
  49.          if (x > 0 && y > 0 && x <= n && y <= n && !vis[x][y] && map[x][y] != -1)
  50.          {
  51.             vis[x][y] = 1;
  52.             q.push(Node(x, y, now.step + 1));
  53.          }
  54.       }
  55.    }
  56.  
  57. }
  58.  
  59.  
  60. int main()
  61. {
  62.    while (cin >> n >> m >> k >> d)
  63.    {
  64.       //init
  65.       memset(vis, 0, sizeof(vis));
  66.       memset(map, 0, sizeof(map));
  67.       memset(num, 0, sizeof(num));
  68.       while (!q.empty()) q.pop();
  69.       ans = 0;
  70.  
  71.       //read
  72.       for (int i = 0; i < m; i++)
  73.       {
  74.          cin >> x >> y;
  75.          map[x][y] = 1;
  76.          vis[x][y] = 1;
  77.          q.push(Node(x, y, 0));
  78.       }
  79.       for (int i = 0; i < k; i++)
  80.       {
  81.          cin >> x >> y >> c;
  82.          map[x][y] = 2;
  83.          num[x][y] += c;
  84.       }
  85.       for (int i = 0; i < d; i++)
  86.       {
  87.          cin >> x >> y;
  88.          map[x][y] = -1;
  89.       }
  90.  
  91.       BFS();
  92.  
  93.       cout << ans << endl;
  94.  
  95.  
  96.    }
  97.  
  98.    return 0;
  99. }

 

ACM-最优配餐的更多相关文章

  1. CCF CSP 201409-4 最优配餐

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-4 最优配餐 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越 ...

  2. CCF 201409-4 最优配餐

    问题描述 试题编号: 201409-4 试题名称: 最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么 ...

  3. CCF模拟题 最优配餐

    最优配餐 时间限制: 1.0s 内存限制: 256.0MB   问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在 ...

  4. CCF-最优配餐(BFS)

    最优配餐   问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题.栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方 ...

  5. CCF 最优配餐 (BFS)

    问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的 ...

  6. 最优配餐_暴力bfs

    问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的 ...

  7. csp20140904最优配餐_Solution

    Solution 经典bfs,所有的点到店的最短距离 其中一开始队列的长度为店的数目 一个点可能有多个订单 关于数据大小: 1.1000*(1000*1000)*2000=2,0000,0000,00 ...

  8. [Ioi2007]Miners 矿工配餐(BZOJ1806)

    [Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 214  Solved: 128 Description 现有两 ...

  9. BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )

    dp... ------------------------------------------------------------------------------- #include<cs ...

随机推荐

  1. F: Horse Pro 马走棋盘 BFS

    F: Horse Pro 豆豆也已经开始学着玩象棋了,现在豆豆已经搞清楚马的走法了,但是豆豆不能确定能否在 100 步以内从一个点到达另一个点(假设棋盘无限大). Input 第一行输入两个整数 x1 ...

  2. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)

    运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...

  3. iOS 开发之 开发一款自己的美颜相机

    以前在公司做项目时很少遇到对相机.图片进行处理的(非公司业务),只是偶尔上传,裁剪,预览下.近期自己准备写个相机应用,把图片处理的这些技术细节整理下.包含美颜相机,图片美化,简单拼图,艺术拼图等主要模 ...

  4. MySQL : INSERT INTO SELECT

    INSERT INTO wx_announcement_push ( title, content, STATUS, del_flag, user_login_name ) SELECT '大家好', ...

  5. Eth合约攻击续

    合同代表一个非常简单的游戏:谁给它发送了比当前奖金还大的数量的以太,就成为新的国王.在这样的事件中,被推翻的国王获得了新的奖金,但是如果你提交的话那么合约就会回退,让level重新成为国王,而我们的目 ...

  6. Tensorflow之AttributeError: module 'tensorflow' has no attribute 'mul'

      tf.mul已经在新版本中被移除,请使用 tf.multiply 代替

  7. 三星 S10 运行 Ubuntu 系统

    导读 DeX 是一种模仿桌面操作系统的用户 UI 界面,把支持 DeX 的三星手机用数据线连上外置显示器,用户就可以获得一种类似桌面系统的使用体验. 三星 S8.Note 8.S9.Note 9.S1 ...

  8. jQuery序列化表单 serialize() serializeArray()(非常重要)

    https://m.2cto.com/kf/201412/361303.html 2014-12-15 1.serialize()方法 描述:序列化表单内容为字符串,用于Ajax请求. 格式:var ...

  9. Windows中使用QEMU创建树莓派虚拟机

    环境: windows 10 2018-04-18-raspbian-stretch.img 一.下载QEMU 根据你的系统情况,下载相应的版本,并安装完成 https://www.qemu.org/ ...

  10. osgb的顶点,纹理,索引,UV读取与存储

    virtual void apply(osg::Geode& node) { ; i < node.getNumDrawables(); i++) { osg::Geometry* ge ...