[bzoj1070][SCOI2007]修车——费用流
题目大意:
题解:
本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,《挑战程序设计竞赛》一书中有详细解答,我写一下大致的解法。
我们把每个维修员拆成n个点,由每个车子向每个维修员连接n条边,分别代表是该维修员维修的第i个车子。
容易知道,如果车辆i在维修员j处是第k个修的,那么费用就一定会包括k*z[i][j](车辆i的等待时间也包括在内)。
跑一边费用流就好辣。。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 65;
const int inf = 0x3f3f3f;
const int maxm = 15;
const int maxv = maxn * maxm * 2;
int z[maxn][maxm];
int n, m, v, s, t;
struct edge {
int from, to, cap, cost;
};
vector<edge> edges;
vector<int> G[maxn * maxm * 2];
void read() {
memset(z, 0, sizeof(z));
scanf("%d %d", &m, &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &z[i][j]);
}
int dist[maxv], pre[maxv], a[maxv], inq[maxv];
void add_edge(int s, int t, int cap, int cost) {
edges.push_back((edge){s, t, cap, cost});
edges.push_back((edge){t, s, 0, -cost});
int m = edges.size();
G[s].push_back(m - 2);
G[t].push_back(m - 1);
}
bool spfa(int s, int t, int &flow, int &cost) {
for (int i = 0; i < v; i++)
dist[i] = inf;
memset(pre, -1, sizeof(pre));
memset(inq, 0, sizeof(inq));
queue<int> q;
q.push(s);
dist[s] = 0;
inq[s] = 1;
a[s] = inf;
while (!q.empty()) {
int v = q.front();
q.pop();
inq[v] = 0;
for (int i = 0; i < G[v].size(); i++) {
edge &e = edges[G[v][i]];
if (e.cap > 0 && dist[e.to] > dist[v] + e.cost) {
a[e.to] = min(a[v], e.cap);
pre[e.to] = G[v][i];
dist[e.to] = dist[v] + e.cost;
if (!inq[e.to]) {
q.push(e.to);
inq[e.to] = 1;
}
}
}
}
if (dist[t] >= inf)
return false;
flow += a[t];
cost += dist[t] * a[t];
int u = t;
while (u != s) {
edges[pre[u]].cap -= a[t];
edges[pre[u] ^ 1].cap += a[t];
u = edges[pre[u]].from;
}
return true;
}
int mcmf(int s, int t) {
int flow = 0;
int cost = 0;
while (spfa(s, t, flow, cost))
;
return cost;
}
void solve() {
// 0-n-1 车子
// n-2n-1 一号工作员
// 2n-3n-1 二号工作员
s = n + n * m, t = s + 1, v = t + 1;
for (int i = 0; i < n; i++)
add_edge(s, i, 1, 0);
for (int j = 0; j < m; j++) {
for (int k = 0; k < n; k++) {
add_edge(n + j * n + k, t, 1, 0);
for (int i = 0; i < n; i++) {
add_edge(i, n + j * n + k, 1, (k + 1) * z[i][j]);
}
}
}
double ans = (double)mcmf(s, t) / n;
printf("%.2f\n", ans);
}
int main() {
read();
solve();
return 0;
}
[bzoj1070][SCOI2007]修车——费用流的更多相关文章
- [BZOJ1070][SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 6209 Solved: 2641[Submit][Status] ...
- [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- 【BZOJ1070】[SCOI2007]修车 费用流
[BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- P2053 [SCOI2007]修车 费用流
$ \color{#0066ff}{ 题目描述 }$ 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M ...
- 【BZOJ 1070】[SCOI2007]修车 费用流
就是拆个点限制一下(两点一排一大片),这道题让我注意到了限制这个重要的词.我们跑网络流跑出来的图都是有一定意义的,一般这个意义就对应了问题的一种方案,一般情况下跑一个不知道对不对的方案是相对容易的我们 ...
- [SCOI2007]修车 费用流
---题面--- 题解: 因为我们并不需要知道准确方案,而人数固定,要使得平均等待时间最小,也就是要使得总的等待时间最小. 因此我们将工人按每个时刻拆点,拆完之后向车子连边,流量为1,费用为k * 维 ...
- [SCOI2007]修车 费用流 BZOJ 1070
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- BZOJ.1070.[SCOI2007]修车(费用流SPFA)
题目链接 /* 神tm看错题*2.. 假如人员i依次维修W1,W2,...,Wn,那么花费的时间是 W1 + W1+W2 + W1+W2+W3... = W1*n + W2*(n-1) + ... + ...
随机推荐
- 使用Cookie记住用户名和密码
Login.jsp <form name = "f1" method="get" action="servlet/LoginServlet&qu ...
- uboot移植前奏
Tiny4412开发板硬件版本为: 底板: Tiny4412/Super4412SDK 1506 核心板:Tiny4412 - 1412 1.下载u-boot源代码,建立u ...
- 使用命令创建github代码仓库,push本地仓库到github远程代码仓库
1.利用命令创建github远程代码仓库 在将本地代码push到github远程代码仓库之前,总是需要新建github代码仓库,在将本地仓库关联到github远程仓库.其中最为繁琐的操作是建立gith ...
- highcharts设置Y轴范围及根据Y轴范围设置不同颜色
yAxis : { title : { text : '数据' }, plotLines : [ { value : 0, width : 1, color : '#808080' } ], min: ...
- Intellij Idea 配置并发布tomcat项目
作为一个菜鸟,我还是很想提高自己.但是既然说了是菜鸟,当然很容易半路折翅 从刚听说intellij idea(以下简称 idea)到现在,应该有超过一个月了吧,我的电脑装了三四次系统了(刚换了一台电脑 ...
- Android开发:View的几种布局及实践
引言 View的布局显示方式有下面几种:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Table Layout).网格视图(Grid View).标签布 ...
- CentOS 6.6下JDK1.7安装与配置(Linux)经典入门详解案例
最近用的linux较多,在网站找了一些关于linux环境下jdk安装的教程,过程是有的但是好多细节都没有表现出来,所以我花了点时间总结了一下,希望对大家都有帮助... CentOS下JDK1.7安装与 ...
- Delphi基本图像处理方法汇总
这篇文章主要介绍了Delphi基本图像处理方法,实例汇总了Delphi操作图像实现浮雕.反色.模糊.翻转等常用效果的方法,非常具有实用价值,需要的朋友可以参考下 本文实例汇总了Delphi基本图像 ...
- plsql developer日期时间格式设置
1 工具->首选项->日期/时间都使用windows格式: 2 在环境变量加入 nls_date_format=YYYY-MM-DD HH24:MI:SS nls_timestamp_fo ...
- Flex移动应用程序开发的技巧和窍门(二)
范例文件 flex-mobile-dev-tips-tricks-pt2.zip 这是关于Flex移动应用程序开发的技巧和窍门的一系列文章中的第二部分.第一部分 内容主要集中讨论了视图之间以及应用程序 ...