题目大意:

传送门

题解:

本题和(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]修车——费用流的更多相关文章

  1. [BZOJ1070][SCOI2007]修车 费用流

    1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6209  Solved: 2641[Submit][Status] ...

  2. [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)

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

  3. 【BZOJ1070】[SCOI2007]修车 费用流

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

  4. bzoj 1070: [SCOI2007]修车 费用流

    1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2785  Solved: 1110[Submit][Status] ...

  5. P2053 [SCOI2007]修车 费用流

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

  6. 【BZOJ 1070】[SCOI2007]修车 费用流

    就是拆个点限制一下(两点一排一大片),这道题让我注意到了限制这个重要的词.我们跑网络流跑出来的图都是有一定意义的,一般这个意义就对应了问题的一种方案,一般情况下跑一个不知道对不对的方案是相对容易的我们 ...

  7. [SCOI2007]修车 费用流

    ---题面--- 题解: 因为我们并不需要知道准确方案,而人数固定,要使得平均等待时间最小,也就是要使得总的等待时间最小. 因此我们将工人按每个时刻拆点,拆完之后向车子连边,流量为1,费用为k * 维 ...

  8. [SCOI2007]修车 费用流 BZOJ 1070

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

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

    题目链接 /* 神tm看错题*2.. 假如人员i依次维修W1,W2,...,Wn,那么花费的时间是 W1 + W1+W2 + W1+W2+W3... = W1*n + W2*(n-1) + ... + ...

随机推荐

  1. 使用Cookie记住用户名和密码

    Login.jsp <form name = "f1" method="get" action="servlet/LoginServlet&qu ...

  2. uboot移植前奏

    Tiny4412开发板硬件版本为:       底板:  Tiny4412/Super4412SDK 1506        核心板:Tiny4412 - 1412 1.下载u-boot源代码,建立u ...

  3. 使用命令创建github代码仓库,push本地仓库到github远程代码仓库

    1.利用命令创建github远程代码仓库 在将本地代码push到github远程代码仓库之前,总是需要新建github代码仓库,在将本地仓库关联到github远程仓库.其中最为繁琐的操作是建立gith ...

  4. highcharts设置Y轴范围及根据Y轴范围设置不同颜色

    yAxis : { title : { text : '数据' }, plotLines : [ { value : 0, width : 1, color : '#808080' } ], min: ...

  5. Intellij Idea 配置并发布tomcat项目

    作为一个菜鸟,我还是很想提高自己.但是既然说了是菜鸟,当然很容易半路折翅 从刚听说intellij idea(以下简称 idea)到现在,应该有超过一个月了吧,我的电脑装了三四次系统了(刚换了一台电脑 ...

  6. Android开发:View的几种布局及实践

    引言 View的布局显示方式有下面几种:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Table Layout).网格视图(Grid View).标签布 ...

  7. CentOS 6.6下JDK1.7安装与配置(Linux)经典入门详解案例

    最近用的linux较多,在网站找了一些关于linux环境下jdk安装的教程,过程是有的但是好多细节都没有表现出来,所以我花了点时间总结了一下,希望对大家都有帮助... CentOS下JDK1.7安装与 ...

  8. Delphi基本图像处理方法汇总

    这篇文章主要介绍了Delphi基本图像处理方法,实例汇总了Delphi操作图像实现浮雕.反色.模糊.翻转等常用效果的方法,非常具有实用价值,需要的朋友可以参考下   本文实例汇总了Delphi基本图像 ...

  9. plsql developer日期时间格式设置

    1 工具->首选项->日期/时间都使用windows格式: 2 在环境变量加入 nls_date_format=YYYY-MM-DD HH24:MI:SS nls_timestamp_fo ...

  10. Flex移动应用程序开发的技巧和窍门(二)

    范例文件 flex-mobile-dev-tips-tricks-pt2.zip 这是关于Flex移动应用程序开发的技巧和窍门的一系列文章中的第二部分.第一部分 内容主要集中讨论了视图之间以及应用程序 ...