[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) + ... + ...
随机推荐
- org.springframework.data.mapping.PropertyReferenceException: No property created found for type
错误原因:org.springframework.data.domain.SortSort sort=new Sort(Sort.Direction.DESC,"created_time&q ...
- Recovering a WiredTiger collection from a corrupt MongoDB installation
Reference: http://www.alexbevi.com/blog/2016/02/10/recovering-a-wiredtiger-collection-from-a-corrupt ...
- bzoj2599
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2476 Solved: 733[Submit][Status ...
- swift button一些简单设置
1,按钮的创建(1)按钮有下面四种类型: UIButtonType.ContactAdd:前面带“+”图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果 UIButtonType.DetailDiscl ...
- PHP根据URL提取根域名
<?php #使用示例 echo getBaseDomain('http://blog.jp.goo.ne.jp/index.php')->domain;echo "\n&quo ...
- Unity3D中切换场景可能导致材质变暗的问题
Unity版本:5.1.1f1 做公司项目的时候,无意间发现了一个很奇葩的现象:场景A(纯UI,故没有光源)转场到场景B的时候,B中原有的光源似乎失效了,但在Hierarchy窗口中能够看到光源存在, ...
- Linux中的zero-copy技术
本文是对参考文章重要部分的摘录,同时进行简单地总结. 零拷贝技术的相关背景知识 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的 ...
- js控制公共模板中,不同页面中的导航选中效果-判断当前的url
用js的做法也很多.比较推荐的方法是判断当前的url,然后根据url在nav中的位置,来对nav中的某个导航增加选中样式,代码如下: <!doctype html> <html la ...
- Js让光标停在输入框input框最后面
var val = $(this) val(); 1.$(this). focus(); 2.$(this).val(""); 3.$(this).val(val); 1. ...
- mac下sublime 配置查看源码
sublime及package control的安装查看之前一篇文章:http://www.cnblogs.com/xdwa/p/5805101.html 安装ctags 安装完毕package co ...