1070: [SCOI2007]修车

https://www.lydsy.com/JudgeOnline/problem.php?id=1070

分析:

  每个第几次修车等的时间都不一样,当前第i个人修理的车的队列是a1,a2...ak,那么对于ak等待的时间就是前面所有车的修理时间之和。如果这样建图显然空间开不下。考虑换种建图方式,a1对于后面所有车的等待时间都会加上它的修理时间,每个修理的汽车,都会对后面所有修的车加上它的修理时间。

  所以每个人拆成n个点,第i个点表示倒数第i个修的车,那么所有的花费都应乘以i。

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int INF = 1e9;
const int N = ; struct Edge{
int u, to, nxt, f, c;
Edge () {}
Edge (int _1,int _2,int _3,int _4,int _5) { u = _1, to = _2, f = _3, c = _4, nxt = _5; }
}e[];
int head[N], En = , S, T; namespace MaxflowMincost{
int pre[N], dis[N], q[], Maxflow, Mincost; // q[N]!!!
bool vis[N];
bool spfa() {
for (int i=; i<=T; ++i) dis[i] = INF, vis[i] = false, pre[i] = ;
int L = , R = ;
q[++R] = S, dis[S] = , vis[S] = true, pre[S] = ;
while (L <= R) {
int u = q[L ++]; vis[u] = false;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].c && e[i].f > ) {
dis[v] = dis[u] + e[i].c;
pre[v] = i;
if (!vis[v]) q[++R] = v, vis[v] = true;
}
}
}
return dis[T] != INF;
}
void mcf() {
int zf = INF;
for (int i=T; i!=S; i=e[pre[i]].u)
zf = min(zf, e[pre[i]].f);
for (int i=T; i!=S; i=e[pre[i]].u)
e[pre[i]].f -= zf, e[pre[i] ^ ].f += zf;
Maxflow += zf, Mincost += dis[T] * zf;
}
void solve() {
Mincost = Maxflow = ;
while (spfa())
mcf();
}
} void add_edge(int u,int v,int f,int c) {
++En; e[En] = Edge(u, v, f, c, head[u]); head[u] = En;
++En; e[En] = Edge(v, u, , -c, head[v]); head[v] = En;
} int main() {
int m = read(), n = read();
S = n + m * n + , T = S + ; for (int i=; i<=n; ++i) add_edge(S, i, , );
for (int i=; i<=n; ++i) { // 第i辆车
for (int j=; j<=m; ++j) { // 第j个人
int w = read();
for (int k=; k<=n; ++k) // 第k次修
add_edge(i, j * n + k, , k * w); // i+n, j*n+k !!!
}
}
for (int i=n+,lim=(n+m*n); i<=lim; ++i) add_edge(i, T, , ); MaxflowMincost::solve();
int ans = MaxflowMincost::Mincost;
printf("%.2lf", (1.0 * ans) / (1.0 * n));
return ;
}

1070: [SCOI2007]修车的更多相关文章

  1. BZOJ 1070: [SCOI2007]修车 [最小费用最大流]

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

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

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

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

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

  4. bzoj 1070 [SCOI2007]修车(最小费用最大流)

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

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

    题目链接:BZOJ - 1070 题目分析 首先想到拆点,把每个技术人员拆成 n 个点,从某个技术人员拆出的第 i 个点,向某辆车连边,表示这是这个技术人员修的倒数第 i 辆车.那么这一次修车对整个答 ...

  6. 【BZOJ】1070: [SCOI2007]修车(费用流+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 好神的题!!!orz 首先我是sb不会拆点..... 首先,每一个技术人员维修车辆都有一个先后 ...

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

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

  8. bzoj 1070 [SCOI2007]修车——网络流(拆边)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1070 后面还有几辆车在这个人这儿修,自己这辆车的时间对总时间的贡献就要多乘上几倍. 所以可以 ...

  9. bzoj 1070 [SCOI2007]修车

    最小费用最大流. 将每个技术人员拆成车数个点,技术人员i的第j个点代表技术人员i修的倒数第j辆车. 源点向所有技术人员点连一条容量为1费用为0的边. 所有技术人员点向所有车点连边:技术人员i的第j个点 ...

随机推荐

  1. redis三节点sentinel部署

    角色          ip       port master      127.0.0.1  6379  slave-1     127.0.0.1  6380  slave-2     127. ...

  2. xml-apis-ext.jar

    xml-apis-ext.jar,hightcharts导出图片是解决乱码需要用到的一个包

  3. DataGrid添加滚动条

    DataGrid中是没有滚动条的,要添加滚动条需要借助<div>层 <div style="overflow:auto;width:95%;height:95%" ...

  4. Yii2控制器 返回 json 格式数据

    Yii::$app->response->format = Response::FORMAT_JSON; $data = User::find()->where([])->as ...

  5. mongo安装跟启动

    mongo下载地址:http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz

  6. Entity FreamWork 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型错误解决

    Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指 ...

  7. Mybatis ,框架

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML ...

  8. LeetCode21.合并两个有序链表 JavaScript

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...

  9. 前端基础-CSS的属性相关设置

    一 字体属性 二 文本属性 三 背景属性 四 盒子模型 五 盒子模型各部分详解 一. 字体属性 1.font-weight:文字粗细(表格中*为重点) 取值 描述   normal 默认值,标准粗细 ...

  10. oracle之DQL

    一.单表查询 语法:select * from table where 条件 group by 分组 having 过滤分组 order by 排序 --查询平均工资低于2000的部门的最大工资和平均 ...