题面

解析

这题要拆点。。

首先,证明一个式子:

设修理员M修了N辆车,

且修每辆车的时间为W1,W2....WN。

那么,这个修理员一共花的时间就为:W1*N+W2*(N-1)+...+WN*1。

因此,若i号修理员修第j辆车的时间为c[i][j],

将c[i][j]拆成1...n个点,

将其中第k个点与j号顾客(j号车)相连,

费用为c[i][j]*k,

最后将修理员与源点相连,顾客与汇点相连(反过来也可以),

流量为1,费用为0。

跑费用流就行了。

上AC代码:

//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; inline int read(){
int sum=,f=;char ch=getchar();
while(ch>'' || ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){sum=sum*+ch-'';ch=getchar();}
return f*sum;
} const int INF=0x3f3f3f3f;
struct node{
int to,next,v,w;
}e[];
struct hh{
int fa,edge;
}pre[];
int n,m,s,t;
int c[][]/*第i辆车给第j个人修的时间*/;
int head[],cnt=;
int d[],inq[],mi[]; void add(int x,int y,int v,int w){
//printf("%d -> %d : %d\n",x,y,w);
e[++cnt].to=head[x];
e[cnt].next=y;
e[cnt].v=v;e[cnt].w=w;
head[x]=cnt;
e[++cnt].to=head[y];
e[cnt].next=x;
e[cnt].v=;e[cnt].w=-w;
head[y]=cnt;
} bool spfa(){
memset(d,0x3f,sizeof(d));
memset(inq,,sizeof(inq));
memset(mi,0x3f,sizeof(mi));
queue <int> que;
que.push(s);
d[s]=;
while(!que.empty()){
int x=que.front();
que.pop();
inq[x]=;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(!e[i].v||d[k]<=d[x]+e[i].w) continue;
d[k]=d[x]+e[i].w;
pre[k].fa=x;pre[k].edge=i;
mi[k]=min(mi[x],e[i].v);
if(!inq[k]) que.push(k);
inq[k]=;
}
}
return d[t]!=INF;
} void EK(){
int ans=;
while(spfa()){
for(int i=t;i!=s;i=pre[i].fa){
e[pre[i].edge].v-=mi[t];
e[pre[i].edge^].v+=mi[t];
}
ans+=d[t]*mi[t];
}
printf("%.2lf\n",(double)((double)ans/(double)n));
} int main(){
// freopen("fixed.in","r",stdin);
// freopen("fixed.out","w",stdout);
m=read();n=read();
s=+(m+)*n;t=+(m+)*n;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
c[i][j]=read();
}
}
for(int i=;i<=m;i++){
for(int j=;j<=n;j++){
add(s,i+m*j,,);
for(int k=;k<=n;k++){
add(i+m*j,k+m*n+n,,c[k][i]*j);
}
}
}
for(int i=;i<=n;i++){
add(i+m*n+n,t,,);
}
EK();
return ;
}

题解 [SCOI2007]修车的更多相关文章

  1. 【BZOJ1070】[SCOI2007]修车

    [BZOJ1070][SCOI2007]修车 题面 以后要多写题面flag 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 ...

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

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

  3. bzoj1070: [SCOI2007]修车(费用流)

    1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...

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

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

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

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

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

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

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

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

  8. BZOJ_1070_[SCOI2007]修车_费用流

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

  9. P2053 [SCOI2007]修车(费用流)

    P2053 [SCOI2007]修车 顾客平均等待的最小时间$=$等待总时间$/n$ 考虑只有1个技术人员时,$n$辆车等待总时间 $A_1+(A_1+A_2)+(A_1+A_2+A_3)+...+\ ...

随机推荐

  1. GIP画图

    世界坐标:相对于winform窗体来说的, 页面坐标:相对于控件的 设置坐标:相对于显示器 获得Graphics对象一般有两种方式: 1.控件.CreateGraphics();//通过该方式创建后要 ...

  2. ArrayList类的set()方法

    ArrayList类的set()方法用于更新指定位置的内容,若内容是new出来的,则需要调用该set()方法:否则,不需要调用该set()方法,示例如下 User.java public class ...

  3. 2019CSP-S游记

    \(2019CSP-S\)游记 \(Day : -26\) 初赛退役失败,准备复赛了... \(Day:0\) 早上\(7:30\)出发坐车去杭州,车上一直在听歌和睡觉中度过(话说锦零的歌真好听).. ...

  4. redis 学习(18)-- AOF

    redis -- AOF 什么是 AOF 通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中. 日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中. 当redi ...

  5. 【原创】大叔经验分享(62)kudu副本数量

    kudu的副本数量是在表上设置,可以通过命令查看 # sudo -u kudu kudu cluster ksck $master ... Summary by table Name | RF | S ...

  6. [转载]python with语句的用法

    https://www.cnblogs.com/DswCnblog/p/6126588.html 看这篇文章的时候看到了python的类名()用法,很好奇,上网查了下,原来这就相当于对类进行实例化了. ...

  7. 文档.Write()和文档.Writeln()石材

    文档.Write()和文档.Writeln()文档是Javascript对象,其中封装了许多有用的方法,其中Write()和Writeln()是直接从浏览器窗口输出文本信息的方法.文件.Write() ...

  8. HTML之美化盒子

    1.    美化盒子 1.1.          美化文本 1.1.1.  字体大小[font-size]: 字符框的高度,可继承,默认值medium,16px.基准字号:浏览器设置的默认字体大小,通 ...

  9. pycharm的快捷键以及快捷意义

    ctrl+a 全选 ctrl+c 复制(默认复制整行) ctrl+v 粘贴 ctrl+x 剪切(默认复制整行) ctrl+f 搜索 ctrl+z 撤销 ctrl+shift+z 反撤销 ctrl+d ...

  10. 在Mysql中使用索引

    MySQL查询的优化是个老生常谈的问题,方法更是多种多样,其中最直接的就是创建索引. 这里通过一个简单的demo来实际用一下索引,看看索引在百万级别查询中速率的提升效果如何 所需数据可以从我前面的一篇 ...