题面

解析

这题要拆点。。

首先,证明一个式子:

设修理员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. SQLSERVER 去除字符串中特殊字符

    原文:SQLSERVER 去除字符串中特殊字符 /*========================================================================== ...

  2. SqlServer判断表中某列是否包含中文,英文,纯数字

    原文:SqlServer判断表中某列是否包含中文,英文,纯数字 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  3. 怎么将本地项目放到码云(gitee)上面?图文详解

    git的好处什么的,在此就不多赘述.现在很多公司都在用git了. 那么怎么将本地已经有的项目放到码云(gitee)上呢? 前置条件说明: 1:原来项目所在位置:D:\workspace01\class ...

  4. MFC使用ado连接SQLserver

    https://blog.csdn.net/GK_2014/article/details/50530103

  5. redis 主从、哨兵、集群

    出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...

  6. 一致性算法—Paxos、Raft、ZAB

    一致性算法—Paxos.Raft.ZAB 2019年04月21日 20:35:09 bulingma 阅读数 64更多 分类专栏: 分布式概念   版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  7. centos7下NFS配置

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 前言 四台机器: ,218三台机器的/root/filedi ...

  8. .net get set用法

    在早期学习c#的过程中,经常遇到这样的语句: public string StudentName{           get{return stuName;}           set{stuNa ...

  9. json返回数据多个是数组,单个就不是处理方案

    /// <summary>         /// 计算方案  当前返回的对象         /// </summary>         [JsonConverter(ty ...

  10. 【weixin】微信支付简介

    一.微信支付模式 1.付款码支付 付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线下面对面收银的场景. 2.Native支付 Native支付是商户系 ...