P2053 [SCOI2007]修车


这道题的思路当真是很不错了,首先,N和M都不是很大。(这是废话了)

然后,看到等修车的时间是一个和的形式,因为从某一时刻进去大家都在等,然后修了的第一批的人的消耗的时间为A1的话,第二个人单独修车为A2的话,那么到了第N个人去弄完之后整个的时间和,也就是指N * A1 + (N - 1) * A2 + (N - 2) * A3 + (N - i + 1) * Ai + ……+ AN。

那么,是不是需要去考虑这个修车的师傅是第几次修车了,因为修车的次数越上去之后,也表明的是跟在后面的也就越便宜了,所以我想着倒着来思考,把第N个取的,看作只取了一个的时候,然后我们对应的去拆点来想。

可以把这M个师傅拆成(第i次修车、第j个师傅)这样的样例(这里的第i次修车依然是倒序的),然后我们把这N * M个点链接在汇点上面,同时把N个车,去跟所有的N * M个(修车师傅的)点连上对应的关系,期间的费用是第K次修车的K再去乘以该修车师傅修该车的钱。

然后,剩下的就是费用流了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
#define MP3(a, b, c) MP(MP(a, b), c)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 1e5 + 7, maxE = 3e5 + 7;
int N, M, head[maxN], cnt, mp[65][11], S, T;
struct Eddge
{int nex, u, to, flow, cost;Eddge(int a=-1, int now=0, int b=0, int c=0, int d=0):nex(a), u(now), to(b), flow(c), cost(d) {}
}edge[maxE];
inline void addEddge(int u, int v, int f, int w)
{edge[cnt] = Eddge(head[u], u, v, f, w);head[u] = cnt++;
}
inline void _add(int u, int v, int f, int w) { addEddge(u, v, f, w); addEddge(v, u, 0, -w); }
int pre[maxN], Flow[maxN], dist[maxN];
queue<int> Q;
bool inque[maxN];
inline bool spfa()
{memset(pre, -1, sizeof(pre)); memset(dist, INF, sizeof(dist)); memset(inque, false, sizeof(inque));while(!Q.empty()) Q.pop();Q.push(S); inque[S] = true; dist[S] = 0; Flow[S] = INF;while(!Q.empty()){int u = Q.front(); Q.pop(); inque[u] = false;for(int i=head[u], v, f, w; ~i; i=edge[i].nex){v = edge[i].to; f = edge[i].flow; w = edge[i].cost;if(f > 0 && dist[v] > dist[u] + w){dist[v] = dist[u] + w;Flow[v] = min(Flow[u], f);pre[v] = i;if(!inque[v]){inque[v] = true;Q.push(v);}}}}return pre[T] ^ -1;
}
inline int EK()
{int ans = 0;while(spfa()){int now = T, las = pre[now];while(now){edge[las].flow -= Flow[T];edge[las^1].flow += Flow[T];now = edge[las].u;las = pre[now];}ans += dist[T] * Flow[T];}return ans;
}
inline void init()
{cnt = S = 0;    T = N + N * M + 1;memset(head, -1, sizeof(head));
}
int main()
{scanf("%d%d", &M, &N);init();for(int i=1; i<=N; i++) for(int j=1; j<=M; j++) scanf("%d", &mp[i][j]);for(int i=1; i<=N; i++){_add(S, i, 1, 0);   //从源点到每一辆车}for(int i=N + 1; i < T; i++){_add(i, T, 1, 0);   //从每个“第几次修车”的“第几个修车师傅”到汇点}for(int i=1; i<=N; i++) //第几辆车(i){for(int j=1; j<=M; j++) //第几个修车的师傅(N + (k - 1) * M + j){for(int k=1; k<=N; k++) //他修的“第几”辆车了(k)——实际上是倒序的{_add(i, N + (k - 1) * M + j, 1, k * mp[i][j]);}}}printf("%.2lf\n", 1. * EK() / N);return 0;
}

[SCOI2007]修车【最大流最小费用】相关推荐

  1. luogu P2053 [SCOI2007]修车(费用流提前计算)

    P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...

  2. BZOJ 1070: [SCOI2007]修车(最小费用最大流)

    建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cs ...

  3. [BZOJ 1070][SCOI2007]修车(费用流)

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

  4. [SCOI2007] 修车(费用流 + 差分时间段建图)

    problem luogu-P2053 solution 假设只有一个工作人员.修车顺序为 p1,p2,...,pnp_1,p_2,...,p_np1​,p2​,...,pn​ 是一个 nnn 的排列 ...

  5. BZOJ 1070: [SCOI2007]修车(费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...

  6. 【BZOJ】1070: [SCOI2007]修车

    1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...

  7. BZOJ 1070: [SCOI2007]修车

    1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要 ...

  8. luogu P2053 [SCOI2007]修车

    P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...

  9. bzoj1070: [SCOI2007]修车 网络流

    bzoj1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的 ...

最新文章

  1. 过去一百年那些“被打脸”的科技预言
  2. 大数据风控-提高授信审查效率,做好这7点是关键
  3. 网络通信-2(TCP通信、ServerSocket、Socket)
  4. mysql命令行设置sqlmodel_MySQL的sql_mode模式说明及设置
  5. SQLite 表达式(http://www.w3cschool.cc/sqlite/sqlite-expressions.html)
  6. 西数硬盘刷新固件_玩4k如何选硬盘?究竟那些硬盘适合你
  7. Devexpress VCL Build v2014 vol 14.1.4 发布
  8. vim学习(2)小幅提升
  9. 此beta版本目前不接受任何新测试员_ASO行业资讯|苹果官方App测试工具TestFlight
  10. python 大众点评模拟登陆_python项目实战:模拟登陆163邮箱,简单到爆
  11. iOS AVAudioRecorder参数设置
  12. 大数乘法(c++)算法
  13. https的报文传输机制
  14. [CTF]ROT5/13/18/47位移密码
  15. exce中让两列数据一一对应_EXCEL让两个表格中的两列数据一一对应:
  16. iOS13 Scene Delegate详解
  17. Activity启动过程源码流程梳理和解读
  18. 自定义函数实现英文字母大小写的转化
  19. Linux系统安装过程详解
  20. php的核心架构如下图,thinksns 核心架构及目录结构

热门文章

  1. 面试中的杂七杂八-英文篇
  2. jzoj3690. 【CF418D】Big Problems for Organizers/codeforces418D
  3. 如何提取html里面的文件,我如何从HTML文件中提取所需的数据?
  4. 阅文新合同出炉,依旧被吐槽:换汤不换药?
  5. webdriver java等待_等待下载完成在selenium webdriver JAVA
  6. GPT解读(论文 + TensorFlow实现)
  7. vue项目搭建问题记录
  8. Linux开发板 - 02 - eop/uboot下载
  9. 免费利用python把pdf格式转docx
  10. 朱大能求职之旅-为什么使用消息队列?消息队列有什么优缺点?Kafka/Activemq/Rabbitmq/Rocketmq优缺点对比?