zoukankan      html  css  js  c++  java
  • 最优配餐_暴力bfs

    问题描述

      栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。
      栋栋的连锁店所在的区域可以看成是一个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

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<queue>
     6 #define MAX 1010
     7 using namespace std;
     8 
     9 int n, m, k, d;
    10 int v[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
    11 int vis[MAX][MAX];
    12 int order[MAX][MAX];
    13 
    14 struct Node{
    15     int x, y;
    16     long long dis;
    17     Node(){}
    18     Node(int xx, int yy, int c){
    19         x = xx, y = yy;
    20         dis = c;
    21     }
    22 };
    23 queue<Node>Q;
    24 
    25 bool within(int x, int y){
    26     if (x <= 0 || x > n || y <= 0 || y > n)
    27         return false;
    28     return true;
    29 
    30 }
    31 
    32 void init(){
    33     cin >> n >> m >> k >> d;
    34     int a, b, c;
    35     for (int i = 0; i < m; i++){
    36         cin >> a >> b;
    37         Q.push(Node(a, b, 0));
    38     }
    39     for (int i = 0; i < k; i++){
    40         cin >> a >> b >> c;
    41         order[a][b] += c;
    42     }
    43     for (int i = 0; i < d; i++){
    44         cin >> a >> b;
    45         vis[a][b] = 1;
    46     }
    47 }
    48 
    49 void solve(){
    50     int ans = 0;
    51     while (!Q.empty()){
    52         Node t = Q.front();
    53         Q.pop();
    54         int x = t.x, y = t.y, dis = t.dis;
    55         for (int i = 0; i < 4; i++){
    56             int xx = x + v[i][0], yy = y + v[i][1];
    57             if (within(xx, yy) && !vis[xx][yy]){
    58                 ans += order[xx][yy] * (dis + 1);
    59                 vis[xx][yy] = 1;
    60                 Q.push(Node(xx, yy, dis + 1));
    61             }
    62         }
    63     }
    64     cout << ans << endl;
    65 }
    66 
    67 int main(){
    68     init();
    69     solve();
    70     return 0;
    71 }
  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/6435101.html
Copyright © 2011-2022 走看看