题面

解析

这题要拆点。。

首先,证明一个式子:

设修理员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. [转帖]Xenix — 微软与UNIX的短暂爱恋

    Xenix — 微软与UNIX的短暂爱恋 https://www.linuxdashen.com/xenix-微软与unix的短暂爱恋 原来微软曾经 干过那么牛B的 unix系统. 微软向外宣布Mic ...

  2. 正则re模块--入门

    本文来源:https://www.cnblogs.com/dyfblog/p/5880728.html 对字符串操作 1.应用: 当我们爬取的东西在js文件中,比如我爬今日头条美女的图片时,它的图片u ...

  3. python-文件常用操作

    文件内建函数和方法: open()——打开文件 read()——输入 readline()——输入一行 seek()——文件内移动 write()——输出 close()——关闭文件 练习:

  4. Codeforces 1148E Earth Wind and Fire

    分析 必要条件: ① $\sum_{i=1}^{n} s_i = \sum_{i=1}^{n} t_i$ 预处理: 将 $s, t$ 从小到大排序. 尝试一 首尾匹配.例子 s = 2, 2, 4, ...

  5. PAT B1046.猜拳

    课本AC #include <cstdio> int main() { int n, failA = 0, failB = 0; scanf("%d", &n) ...

  6. linux环境下Python搭建

    安装gcc   yum install gcc 安装zlib   yum -y install zlib* 安装openssl-devel   yum install openssl-devel -y ...

  7. redis 学习(17) -- RDB

    redis -- RDB 什么是 RDB 经过RDB之后,redis会将内存中的数据创建一份快照到硬盘中,称为RDB文件(二进制) 当redis重新启动时,会加载硬盘中的RDB文件,加载到内存中完成数 ...

  8. CW2A与CA2W

    字符串的ASCII和UNICODE之间的转换 1)Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能. 2)ATL还提供了另一套转换 ...

  9. wpf menuitem 简约显示的 template样式

    <ControlTemplate x:Key="MenuItemControlTemplate1" TargetType="{x:Type MenuItem}&qu ...

  10. sql server 2012使用新特性offset和fetch next完成分页操作

    1 select * from HumanResources.Department order by DepartmentID offset rows fetch next rows only; of ...